使用 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 数组后,输出错误的主要内容,如果未能解决你的问题,请参考以下文章
将 Eigen 数组从 c++ 传输到 python 时的地址更改