首页 > 解决方案 > 我可以在不复制任何数据的情况下通过向量附加特征矩阵吗?

问题描述

是否可以在不复制任何数据的情况下将特征向量附加到另一个矩阵?给定矩阵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 对相关问题的精彩回复。这个问题询问如何在不复制数据的情况下创建新矩阵,而我想修改现有矩阵。我可以使用conservativeResize将列附加bm但仅以分配新内存为代价。有人对如何进行有任何想法吗?

标签: c++matrixmemoryeigen

解决方案


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

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(您可以使用新的位置,但我怀疑您是否真的需要这个)。

如果您已经分配了数据m并且b希望将它们的实际数据彼此相邻,则需要复制一些内容(除非数据已经彼此相邻)。


推荐阅读