我可以在不复制任何数据的情况下通过向量附加本征矩阵吗?

时间:2019-05-08 07:17:59

标签: c++ matrix memory eigen

是否可以在不复制任何数据的情况下将特征向量附加到另一个矩阵?给定矩阵m和向量b,我想修改矩阵m使得m = [m, b] 不复制数据。那有可能吗?

一个例子是:

#include <Eigen/Core>
using namespace Eigen;
int main()
{
    MatrixXd m(2,2);
    m << 0, 1, 2, 3;
    VectorXd b(2);
    b << 4, 5;
    return 0;
}

我尝试使用ggael's wonderful reply to a related question。这个问题询问如何在不复制数据的情况下创建新矩阵,而我想修改现有矩阵。我可以使用conservativeResize将列b附加到m上,但这只是以分配新内存为代价。有人对如何进行有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我能想到的唯一解决方案是从一开始就将mb存储在同一矩阵中:

Eigen::MatrixXd mb(2,2+1);
Eigen::Ref<Eigen::MatrixXd> m = mb.leftCols(2);
Eigen::Ref<Eigen::VectorXd> b = mb.col(2);

这些行mb是对更大的mb矩阵的块的可读/可写引用,并且只要mb未调整大小(或毁了)。但是,您无法轻松调整m的大小(可以使用新的展示位置,但是我怀疑您确实需要这个)。

如果您已经为mb分配了数据,并且想让它们的实际数据彼此相邻,那么您将需要复制一些内容(除非数据已经彼此相邻)