在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;
}
第一个cout
输出:
-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。S:在第二个输出中,0始终是0,但其他数字在变化
声明
Matrix3f m[11];
与Eigen
没有太大关系。它是堆栈上的一个普通原始数组,具有11个Eigen::Matrix3f
实例。当你
cout << "n" << m[11] << endl;
这是未定义的行为,因为您有一个越界索引。m
总共有11个元素,由于在c++中索引从0开始,所以m
中最后一个有效对象是m[10]
。未定义的行为意味着你的程序可以做任何事情——因此你不应该试图解释这些结果。
话虽这么说,第一个cout
部分可能不受以下UB的影响。它显示了Eigen
矩阵未初始化的值。
这不是operator[]
。这是一个c风格的数组
int a[42];
定义了一个包含42个int
的数组,命名为a
。
在同一行中,对于类型T
和正整数N
,如下:
T bla[N];
定义了一个类型为T
的N
对象数组。
Matrix3f m[11];
定义一个包含11个Matrix3f
对象的数组。
数组索引从0开始,所以最后一个有效索引是10,而不是代码中的11。由于Eigen没有对其对象进行零初始化,因此在打印0-10个元素的值时将得到随机数。