C 特征会引发错误,但完成计算

C++ Eigen throws error but finishes calculation

本文关键字:计算 错误 特征      更新时间:2023-10-16

我使用eigen有一个以下代码,但是执行时具有某些Wierd行为

#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()&amp;&amp;"无效矩阵产品"&amp; amp;"如果您想要系数或点产品使用相应的显式功能",则文件C: mingw include eigen eigen src/core/product.h,第97行

此应用程序已要求以不寻常的方式终止运行时。请联系应用程序的支持团队以获取更多信息。

15.7222 7.48441 15.4497 8.88806 15.29648.90715 7.4913 4.46665 11.0792 9.322624.38281 5.5597 6.06866 7.33861 3.59835.69089 2.82105 8.79453 2.2928 7.468314.2536 5.6492 11.3739 11.9831 5.049559.85721 16.4741 4.57733 3.87002 2.37858

此外,它还打开gena_exe无法正常工作的窗口(我在Windows笔记本电脑上工作)。

这很奇怪的是,Prūogram被拒绝到结束而不会停止也许只是因为我的代码比错误处理更快发生错误时

请帮助 - 谢谢

好吧,这花了我一秒钟,但是我发现了发生了什么:您在第一个循环for (int i = 0; i<6; i++)中创建了6代,但在下一个for(int i=0;i<=6;i++)中以超过7次迭代,所以最后一个呼叫在MatrixXd ol1 = sigmoid(inp * l1.layerweights)

i<=6更改为i<6,不会发生崩溃。

但是,事情是,您可以在调试器的帮助下很简单地发现它。它确实是有帮助的工具,并且Windows上的大部分IDE都有一个。我鼓励您开始使用它。

另外,只要您的程序是单线程,就不会有机会"在发生错误时更快地处理错误处理"。一旦您尝试做无效的数学表达表达,eigen断言并关闭了您的程序,但是,无论已持续到控制台上的任何东西。