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,否则会发生重新分配并且所有赌注都会关闭)。
我正在使用 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,否则会发生重新分配并且所有赌注都会关闭)。