【发布时间】:2023-03-29 10:03:01
【问题描述】:
我遇到了矩阵乘向量乘法的问题。即看起来无害的表达式总是返回接近 [1 0] 的向量,而看起来相似的表达式返回正确的结果:
// version WITH temp var, correct
Eigen::Vector3d lcoord_eig(lcoord[0], lcoord[1], lcoord[2]);
auto lcoord2d = P3to2 * lcoord_eig;
std::cout << std::endl << lcoord2d << std::endl;
// version WITHOUT temp var, always [1 0]
auto lcoord2d_2 = P3to2 * Eigen::Vector3d(lcoord[0], lcoord[1], lcoord[2]);
std::cout << std::endl << lcoord2d_2 << std::endl;
其中P3to2 是一个 2×3 矩阵 (Eigen::MatrixXd),lcoord 是某个其他库的 3d 向量类型,上面的代码包含在一个 for 循环中。
一些输出(我的注释):
-0.0036135
2.1684e-18 // correct
1
0 // [1 0], wrong
0.00209583
0.000388139 // correct
1
5.55112e-17 // [1 0], wrong
0.00148429
-0.000435008 // correct
1
5.55112e-17 // [1 0], wrong
我花了很长时间才发现这个错误,但我仍然不明白发生了什么会导致第二个版本的行为如此。我犯了什么错误?
编辑:这也发生在常量向量上,比如Eigen::Vector3d(.5,.5,.5)
【问题讨论】:
-
附带说明,
std::endl!=\n,但std::endl==\n+std::flush。