特征保守反对奇怪的行为

时间:2015-08-27 21:08:08

标签: c++ matlab reshape eigen

我正在使用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

知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

conservativeResize()并没有“移动”#34;周围的元素(换句话说,不像MATLABs reshape那样工作,因为它执行内存重新分配,即使初始和最终大小相同)。来自文档:

  

将矩阵的大小调整为行x cols,同时保持旧值不变。

     

...

     

相对于左上角元素调整矩阵的大小。如果需要将值附加到矩阵,它们将是未初始化的。

这些陈述似乎有点令人困惑。这意味着如下:将初始矩阵看作矩形,大小为A x B.然后将调整大小的矩阵视为另一个大小为C x D的矩形。然后在心理上重叠两个矩形,确保左上角角落对两者都很常见。交集的共同元素是由conservativeResize保留的元素。其余的只对应于未初始化的记忆。

如果您想进行真正的重塑,请改用resize()(绝对确保A x B == C x D,否则重新分配并且所有投注均已关闭)。