我正在做复杂的矩阵矩阵乘积,如代码所示。 Eigen * 运算符似乎没有给出正确的结果。为了验证我还编写了另一个例程来查找产品。由此可见,结果的虚部没问题,但实部不准确。有人可以告诉我为什么吗?
Eigen::MatrixXcd U2 = Eigen::MatrixXcd::Random(N1, computed_rank);
Eigen::MatrixXcd V2 = Eigen::MatrixXcd::Random(computed_rank, N2);
Eigen::MatrixXcd W2 = Mat::Zero(N1,N2);
for (size_t k = 0; k < computed_rank; k++) {
W2 += U2.col(k)*V2.row(k);
}
Eigen::MatrixXcd Q = U2*V2;
Eigen::MatrixXcd E2 = Q-W2;
cout << "Err Total: " << E2.norm()/W2.norm() << endl;
cout << "Err Real: " << E2.real().norm()/W2.real().norm() << endl;
cout << "Err Imag: " << E2.imag().norm()/W2.imag().norm() << endl;
给出了结果:
Err Total: 0.84969
Err Real: 1.17859
Err Imag: 1.18274e-16
我发现,当这是项目中唯一的代码时,不会出现此问题。但我把它作为一个更大项目的一部分,但它似乎失败了。
最佳答案
事实证明,GNU 的 -ffast-math 优化标志并不兼容所有程序。我在编译更大的项目时使用了它,而不是在做孤立的项目时使用它。这就是失败的原因!更多详情请参阅https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html .
关于c++ - 使用特征值的复矩阵矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59355414/