假设你有一个矩阵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那里。
另请参阅:本征将矩阵转换为向量
请注意,您可以命名一个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 转置拷贝。
如果您愿意使用 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)
请注意,在某些情况下,使用一维矩阵时可能会降低性能。
| 归档时间: |
|
| 查看次数: |
3428 次 |
| 最近记录: |