使用 c++ Eigen 库处理 numpy 数组后,输出错误

Posted

技术标签:

【中文标题】使用 c++ Eigen 库处理 numpy 数组后,输出错误【英文标题】:After processing numpy arrays with c++ Eigen library the output is wrong 【发布时间】:2014-05-15 12:01:30 【问题描述】:

我需要将 numpy 数组传递给 c++ 函数,对其进行处理并返回另一个 numpy 数组。

现在我已经弄清楚如何传递和返回数组,但是处理结果的某些步骤不正确。

double * process(double *input, int length) 
    Map<Matrix<double, 1, Dynamic>> map(input, length);
    MatrixXd frame(map);
    ...
    RowVectorXd b(7);
    b << 6.46597871e-01,   0.00000000e+00,  -1.93979361e+00,
             1.66081634e-16,   1.93979361e+00,   0.00000000e+00,
            -6.46597871e-01;
    RowVectorXd a(7);
    a <<  1.        , -0.76984955, -1.87432239,  0.90522394,  1.47938621,
               -0.32233495, -0.41804178;

    RowVectorXd temp1 = frame.row(0);
    RowVectorXd temp2 = frame.row(1);
    RowVectorXd first = filter(temp1, a, b);
    ...



RowVectorXd filter(RowVectorXd &input, RowVectorXd &alpha, RowVectorXd &beta) 
    float a0 = alpha(0);
    int order = beta.cols();
    RowVectorXd a = alpha.segment(1, order - 1).reverse() / a0;
    RowVectorXd b = beta.reverse() / a0;
    int size = input.size();
    RowVectorXd output(size + (order - 2) * 2);

    RowVectorXd joined = addZeros(input, order - 1);
    size = joined.cols() - (order - 2);

    for (int k = order; k < size ; k++) 
        RowVectorXd x = joined.segment(k - order, order);
        RowVectorXd y = output.segment(k - order, order - 1);
        double temp = b.dot(x) - a.dot(y);
        cout << " " << temp;
        output(k - 1) = b.dot(x) - a.dot(y);
    
    return output.segment(order - 1, input.cols());

过滤功能已经过测试。过程功能也是如此。因此,如果我从 c++ 调用它们一切都很好,但是当我从 python 调用它们时就不行了。

我一步一步检查了一切,发现过滤函数在处理从python调用的函数时返回错误的结果。

例如,如果输出向量的前四项应为 -2.37、-3.184、5.00 等,则实际输出为 8.68251e+175 2.49091e+175 1.13384e+176 7.03121e+175 一些高得离谱的数字。

p>

我已尝试删除所有优化,我认为这会导致此错误发生(例如 -ffast-math O3),但过滤的输出仍然错误。

这就是调试编译选项

-std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -fPIC

这就是发布编译选项

-std=c++0x -O3 -Wall -c -fmessage-length=0 -march=core2 -ffast-math -fPIC

我想问题可能出在点积计算时内存对齐或类似问题,但这只是一个想法......

谁能指点我这里有什么问题?

【问题讨论】:

【参考方案1】:

好的,问题在于未初始化的向量输出,从 c++ 调用时包含零,从 python 调用时包含随机内容。

【讨论】:

以上是关于使用 c++ Eigen 库处理 numpy 数组后,输出错误的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法性能 numpy 和 eigen c++

将 Eigen 数组从 c++ 传输到 python 时的地址更改

c++ 线性代数入门库

如何使用带有 eigen 数学库的 gdb 进行调试

Windows VSCode 配置 Eigen 库 - C++矩阵计算库的配置 - 手把手教程

Eigen: C++开源矩阵计算库