我正在使用m.conservativeResize()来在Eigen中执行与MatLab中的reshape函数相同的等价物。那么让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行和一列。
然而,这不是我得到的。第一列在列向量中有前三个值 - OK到目前为止 - 但其余值看起来就像来自未初始化内存的垃圾值:
1 3.08116e-309 0.420085
1 -2.68156e+154 1.2461e-47
0 -2.68156e+154 0.634626
知道我做错了吗?
答案 0 :(得分:2)
conservativeResize()
并没有“移动”#34;周围的元素(换句话说,不像MATLABs reshape
那样工作,因为它执行内存重新分配,即使初始和最终大小相同)。来自文档:
将矩阵的大小调整为行x cols,同时保持旧值不变。
...
相对于左上角元素调整矩阵的大小。如果需要将值附加到矩阵,它们将是未初始化的。
这些陈述似乎有点令人困惑。这意味着如下:将初始矩阵看作矩形,大小为A x B.然后将调整大小的矩阵视为另一个大小为C x D的矩形。然后在心理上重叠两个矩形,确保左上角角落对两者都很常见。交集的共同元素是由conservativeResize
保留的元素。其余的只对应于未初始化的记忆。
如果您想进行真正的重塑,请改用resize()
(绝对确保A x B == C x D,否则重新分配并且所有投注均已关闭)。