是否可以在不复制的情况下展平特征矩阵?

use*_*269 5 c++ eigen

假设你有一个矩阵A

1 2
3 4
Run Code Online (Sandbox Code Playgroud)

有两种扁平化:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

1
3
2
4
Run Code Online (Sandbox Code Playgroud)

如果使用默认的 ( ColMajor) 存储类型,我们可以得到后者为

VectorXd v = Map<const VectorXd>(A.data(), A.size())
Run Code Online (Sandbox Code Playgroud)

这只会复制数据一次。

但要得到前者,我能想到的最好的方法是

MatrixXd At = A.transpose()
VectorXd v  = Map<const VectorXd>(At.data(), At.size())
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会复制数据两次。

有点令人困惑(至少对我而言)

VectorXd v  = Map<const VectorXd>(A.transpose().data(), A.size())
Run Code Online (Sandbox Code Playgroud)

编译,但产生完全相同的结果,因为没有transpose那里。

另请参阅:本征将矩阵转换为向量

gga*_*ael 5

请注意,您可以命名一个Map对象:

Map<const VectorXd> v1(A.data(), A.size());
Run Code Online (Sandbox Code Playgroud)

v1像使用VectorXd. 当然,修改v1也会修改A。要将其传递给接受const VectorXd&对象而无需复制的函数,请制作您的函数模板或制作一个Ref<const VectorXd>.

那么第一种情况需要零拷贝,第二种情况需要 1 转置拷贝。


Avi*_*urg 2

如果您愿意使用 aMatrix而不是 a,Vector您可以使用以下内容:

Eigen::MatrixXi m(2, 2);
m << 1, 2, 3, 4;
std::cout << m << "\n\n";

// Option 1
Eigen::MatrixXi v1;
v1 = m.transpose();  // Copy #1
v1.resize(1, 4);  // No copy
std::cout << v1 << "\n\n";

// Option 2
v1 = m;  // Copy #1
v1.resize(1, 4);  // No copy
std::cout << v1 << "\n\n";
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下,使用一维矩阵时可能会降低性能。