Eigen conservativeResize 奇怪的行为

Eigen conservativeResize strange behavior

我正在使用 m.conservativeResize() 在 Eigen 中执行与 MatLab 中的重塑函数等效的操作。所以令 N = 3,然后...

static MatrixXd m(N*N,1);

然后我给这个矩阵分配一些值,它看起来像这样:

1
1
0
1
0
1
0
1
1

然后尝试重塑它...

m.conservativeResize(N,N);

所以现在应该有相同的值,但现在是 N 行 N 列,而不是 N*N 行和一列。

然而,这不是我得到的。第一列包含列向量中的前三个值 - 到目前为止还可以 - 但其余值看起来就像来自未初始化内存的垃圾值:

1  3.08116e-309      0.420085
1 -2.68156e+154    1.2461e-47
0 -2.68156e+154      0.634626

知道我做错了什么吗?

conservativeResize() 不会“移动”元素(换句话说,不像 MATLAB reshape 那样工作,因为它执行内存重新分配,即使初始和最终尺寸相同)。来自文档:

Resizes the matrix to rows x cols while leaving old values untouched.

...

Matrices are resized relative to the top-left element. In case values need to be appended to the matrix they will be uninitialized.

这些说法似乎有点令人费解。它的意思如下:将初始矩阵想象成一个大小为 A x B 的矩形。然后将调整后的矩阵想象为另一个大小为 C x D 的矩形。然后在心理上重叠两个矩形,确保左上角角落是两者共有的。交集的公共元素是conservativeResize保留的元素。其余的只是对应未初始化的内存。

如果您想要真正的重塑,请改用 resize()(绝对确保 A x B == C x D,否则会发生重新分配并且所有赌注都会关闭)。