【问题标题】:Can I append an Eigen matrix by a vector without copying any data?我可以在不复制任何数据的情况下通过向量附加特征矩阵吗?
【发布时间】: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 &lt;&lt; example &lt;&lt; std::endl; 行不分配任何新内存。但是,我可以将example1 用作任何其他矩阵并计算减少(例如)而无需任何内存成本。我想做同样的事情,但不是使用新对象example1 重新定义现有矩阵m,如上所述。你认为这不可能吗?
  • @f* 不,那是不可能的。 m 已经有一个类型,而horizcat 仅适用于使用表达式模板类型。一旦您将表达式模板转换为矩阵,它就会复制(或在某些情况下移动,但不是这个)。

标签: c++ matrix memory eigen


【解决方案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 分配了数据,并且希望它们的实际数据彼此相邻,则需要复制一些内容(除非数据已经彼此相邻)。

【讨论】:

    最近更新 更多