C++ Eigen 抛出错误但完成计算

标签 c++ matrix runtime-error eigen

我有以下代码用于使用 eigen 的小 ai,但它在执行时有一些奇怪的行为

#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 或点积使用各自的显式函数”,文件 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 not working 窗口(我在 windows 笔记本电脑上工作)。

奇怪的是 prūogram 被执行到结束并且没有停止 也许只是因为我的代码比错误处理更快 发生错误时

请帮忙 - 谢谢

最佳答案

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

更改 i<=6进入i<6并且不会发生崩溃。

但是,事实是,在调试器的帮助下,您可以很容易地自行找到它。这是一个非常有用的工具,Windows 上的大多数 IDE 都内置了一个。我鼓励您开始使用它。

此外,只要您的程序是单线程的,代码就不可能“比发生错误时的错误处理更快”。一旦您尝试执行无效的数学表达式,Eigen 就会断言它并关闭您的程序,但是,任何已经打印到控制台的内容都会持续。

关于C++ Eigen 抛出错误但完成计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46257956/

相关文章:

c++ - 向查看器添加两个不同的点云(点云库 (PCL))

Python - 将 for 循环变成单行代码

python - 用 Pandas 为所有字符串对创建距离矩阵

c++ - 从数组中删除一个单元格给我运行时错误

第二次迭代时出现 VBA 运行时错误 91

c++ - windows tcp ip 套接字编程?

c++ - 如何以可移植的方式将整数转换为小端

c++ - 注入(inject) DLL 时,Explorer.exe 在启动时死锁

arrays - 在 Matlab 中将矩阵中的元素 i,j 设置为 i*j

android - 带有 appbundle 和 PROGUARD 的动态功能不起作用