问题描述
在 C++ 中使用 Eigen 库编写以下示例:
#include <iostream>
#include <eigen3/Eigen/Core>
using namespace Eigen;
using namespace std;
int main()
{
Matrix3f mat;
Matrix3f m[11];
cout << mat << endl;
cout << "\n" << m[11] << endl;
}
-37392.8 4.57244e-41 -37378.8
4.57244e-41 -37206.4 4.57244e-41
-37223.2 4.57244e-41 8.40779e-45
第二个输出:
0 -2.51418e-31 0
2.96401e+17 -1.10025e+33 2.9625e+17
3.06324e-41 0 3.06324e-41
[ ]
运算符有什么作用?
mat[value]
与 mat
有何不同?
另一个问题 :p 为什么 Eigen 生成极大或极小的数字,它们是随机的吗?
P.S:在第二个输出上,零总是零,但其他数字正在变化
解决方法
声明
720
与 Matrix3f m[11];
关系不大。它是堆栈上的一个普通原始数组,有 11 个 Eigen
实例。当你
Eigen::Matrix3f
这是未定义的行为,因为您有一个越界索引。 cout << "\n" << m[11] << endl;
共有 11 个元素,由于索引在 C++ 中从 0 开始,因此 m
中的最后一个有效对象是 m
。未定义的行为意味着您的程序可以做任何事情 - 因此您不应该试图解释这些结果。
话虽如此,第一个 m[10]
部分可能不受以下 UB 的影响。它显示了 cout
矩阵的未初始化值。
这不是operator[]
。这是一个 C 风格的数组。
int a[42];
定义了一个名为 int
的 42 个 a
数组。
在同一行中,对于类型 T
和正整数 N
,这个:
T bla[N];
定义类型为 N
的 T
对象数组。
所以你的代码
Matrix3f m[11];
定义了一个包含 11 个 Matrix3f
对象的数组。
数组索引从 0 开始,因此最后一个有效索引是 10,而不是您的代码中的 11。 由于 Eigen 没有对其对象进行零初始化,因此在打印第 0-10 个元素的值时会得到随机数。