本征矩阵[值],什么意思?

Eigen Matrix[value], what does it mean?

在 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 为什么 Eigen 生成非常大或非常小的数字,它们是随机的吗?

P.S:在第二个输出中,零始终为零,但其他数字在变化

宣言

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];

定义 N 个类型为 T 的对象的数组。

所以你的代码

Matrix3f m[11];

定义了一个包含 11 个 Matrix3f 个对象的数组。

数组索引从 0 开始,因此最后一个有效索引是 10,而不是代码中的 11。 由于 Eigen 没有对其对象进行零初始化,因此在打印第 0-10 个元素的值时会得到随机数。