2017-09-16 41 views
0

我已用本征的一小艾本下面的代码完成,但它有执行C++征抛出错误但计算

#include <stdio.h> 
#include <iostream> 
#include <time.h> 
#include <math.h> 
#include <Eigen/Dense> 

using namespace std; 
using namespace Eigen; 

MatrixXd sigmoid(MatrixXd); 
MatrixXd sigmoid_d(MatrixXd); 


class Layer{ 
public: 
MatrixXd layerweights; 

Layer(int x,int y){ 
    layerweights.resize(x,y); 
    for(int i=0;i<layerweights.rows();i++){ 
     for(int j=0;j<layerweights.cols();j++){ 
      double r =(rand()/(double)(RAND_MAX)) * 2 - 1; 
      layerweights(i,j) = r; 
     } 
    } 
} 
Layer(){ 
    this->layerweights.setZero(); 
} 
}; 

class Network{ 
public: 
Layer l1; 
Layer l2; 
MatrixXd inp; 
MatrixXd outp; 
int id; 

Network(){ 
    id = 0; 
    inp.resize(1,5); 
    inp << 0,1,2,3,4; 
    outp.resize(1,5); 
    outp << 0,1,4,9,16; 
} 

MatrixXd think(){ 
    MatrixXd ol1 = sigmoid(inp * l1.layerweights);//1x5*5x5 1x5 
    MatrixXd ol2 = sigmoid(ol1 * l2.layerweights); //1x5*5x5 1x5 
    return ol2; 
} 



int main() { 
Network generation [10]; 
srand(time(NULL)); 
for(int i=0;i<6;i++){      //initialize 1st generation 
    generation[i].l1 = Layer(5,5); 
    generation[i].l2 = Layer(5,5); 
    generation[i].id = i; 
} 

for(int i=0;i<=6;i++){ 
    cout<<generation[i].think()<<'\n'; 
} 

return 0; 
} 

MatrixXd sigmoid(MatrixXd x){ 
return 1./(1+(x.array() * -1).exp()); 
} 

当在控制台输出是一些奇怪的行为:

断言失败: lhs.cols()== rhs.rows()& &“无效矩阵产品”& &“如果你想要coeff-wise或dot产品使用各自的显式函数”,文件c:\ mingw \ include \ eigen \ src/Core/Product.h,第97行

此应用程序已请求运行时以非常规方式终止它。 有关更多信息,请联系应用程序的支持团队。

15.7222 7.48441 15.4497 8.88806 15.2964 8.90715 7.4913 4.46665 11.0792 9.32262 4.38281 5.5597 6.06866 7.33861 3.5983 5.69089 2.82105 8.79453 2.2928 7.4683 14.2536 5.6492 11.3739 11.9831 5.04955 9.85721 16.4741 4.57733 3.87002 2.37858

也将打开运行不正常的gena_exe窗口(我在Windows笔记本电脑上工作)。

关于它的奇怪的是,prūogram被excuted结束和犯规阻止 也许这是因为我的代码是更快,则错误处理 发生错误时

请帮助 - 谢谢

回答

2

好吧,我花了一秒钟,但是我发现发生了什么:你在创建第一个循环for (int i = 0; i<6; i++) 6代,但在迭代下一个for(int i=0;i<=6;i++)超过700,所以最后调用都有空矩阵MatrixXd ol1 = sigmoid(inp * l1.layerweights)

更改i<=6分成i<6,并且不会发生崩溃。

但是,事情是,你可以在调试器的帮助下非常轻松地找到它。这真的是一个有用的工具,Windows上的大多数IDE都有一个内置的模块。我鼓励你开始使用它。另外,只要你的程序是单线程的,代码就没有机会“更快,错误发生时的错误处理”。一旦你试图做无效的数学表达Eigen声称它并关闭你的程序,但是,无论是已经打印到控制台持续。

+0

感谢您的回答,现在我使用eclipse调试工具 –