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

问题描述

在 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:在第二个输出上,零总是零,但其他数字正在变化

解决方法

声明

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

定义类型为 NT 对象数组。

所以你的代码

Matrix3f m[11];

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

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