是否可以在不复制任何数据的情况下将特征向量附加到另一个矩阵?给定矩阵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
上,但这只是以分配新内存为代价。有人对如何进行有任何想法吗?
答案 0 :(得分:1)
我能想到的唯一解决方案是从一开始就将m
和b
存储在同一矩阵中:
Eigen::MatrixXd mb(2,2+1);
Eigen::Ref<Eigen::MatrixXd> m = mb.leftCols(2);
Eigen::Ref<Eigen::VectorXd> b = mb.col(2);
这些行m
和b
是对更大的mb
矩阵的块的可读/可写引用,并且只要mb
未调整大小(或毁了)。但是,您无法轻松调整m
的大小(可以使用新的展示位置,但是我怀疑您确实需要这个)。
如果您已经为m
和b
分配了数据,并且想让它们的实际数据彼此相邻,那么您将需要复制一些内容(除非数据已经彼此相邻)