Aar*_*ger 3 c++ matlab reshape eigen
我使用 m.conservativeResize() 在 Eigen 中做等效于 MatLab 中的 reshape 函数。所以让 N = 3,然后...
static MatrixXd m(N*N,1);
Run Code Online (Sandbox Code Playgroud)
然后我为这个矩阵分配一些值,它看起来像这样:
1
1
0
1
0
1
0
1
1
Run Code Online (Sandbox Code Playgroud)
然后尝试重塑它...
m.conservativeResize(N,N);
Run Code Online (Sandbox Code Playgroud)
所以现在应该有相同的值,但现在在 N 行和 N 列而不是 N*N 行和一列。
然而,这不是我得到的。第一列具有列向量中的前三个值 - 到目前为止还好 - 但其余的值看起来就像来自未初始化内存的垃圾值:
1 3.08116e-309 0.420085
1 -2.68156e+154 1.2461e-47
0 -2.68156e+154 0.634626
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
conservativeResize()不会“移动”元素(换句话说,它不像 MATLABs 那样工作reshape,因为即使初始和最终大小相同,它也会执行内存重新分配)。来自文档:
将矩阵调整为行 x cols,同时保持旧值不变。
...
矩阵相对于左上角元素调整大小。如果需要将值附加到矩阵,它们将是未初始化的。
这些说法似乎有点令人困惑。它的含义如下:将初始矩阵视为一个大小为 A x B 的矩形。然后将调整大小的矩阵视为另一个大小为 C x D 的矩形。然后在精神上重叠两个矩形,确保左上角角是两者共同的。交集的公共元素是由 保留的元素conservativeResize。其余的只是对应于未初始化的内存。
如果您想要真正的重塑,请resize()改用(确保 A x B == C x D,否则会发生重新分配并且所有赌注都将关闭)。