gpt4 book ai didi

c++ - Eigen conservativeResize 奇怪的行为

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:46 24 4
gpt4 key购买 nike

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

static MatrixXd m(N*N,1);

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

1
1
0
1
0
1
0
1
1

然后尝试 reshape 它...

m.conservativeResize(N,N);

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

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

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

知道我做错了什么吗?

最佳答案

conservativeResize()不会“移动”元素(换句话说,不像 MATLABs 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 的矩形。然后在心理上重叠两个矩形,确保左上角角落是两者共有的。交集的公共(public)元素是由 conservativeResize 保留的元素。其余的只是对应未初始化的内存。

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

关于c++ - Eigen conservativeResize 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com