【发布时间】:2026-01-11 07:30:01
【问题描述】:
是否可以在不复制任何数据的情况下将特征向量附加到另一个矩阵?给定矩阵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,但只能以分配新内存为代价。有人对如何进行有任何想法吗?
【问题讨论】:
-
您是在问如何在不复制的情况下将向量附加到矩阵列上?如果是这样,(我说这是经常被指责过早优化的人,但这感觉就像过早优化)。我会考虑进行分析以查找成本的实际来源。在牺牲可读性的情况下,你可以做的最好的 atm 是为你的矩阵预先分配你需要的所有内存。
-
不,这完全不可能。你会如何想象它的内存布局?或者你的意思不是连接成一个完整的矩阵,而是一个表达式模板,并且只有在你访问/评估它时才复制?
-
@PeterT 感谢您的评论!我分析了 ggael 对我与
valgrind massif链接的帖子的回答。我认为auto example1 = horizcat(mat,2*mat); std::cout << example << std::endl;行不分配任何新内存。但是,我可以将example1用作任何其他矩阵并计算减少(例如)而无需任何内存成本。我想做同样的事情,但不是使用新对象example1重新定义现有矩阵m,如上所述。你认为这不可能吗? -
@f* 不,那是不可能的。
m已经有一个类型,而horizcat仅适用于使用表达式模板类型。一旦您将表达式模板转换为矩阵,它就会复制(或在某些情况下移动,但不是这个)。