使用 Eigen 库将列附加到矩阵

Posted

技术标签:

【中文标题】使用 Eigen 库将列附加到矩阵【英文标题】:Append column to matrix, using Eigen library 【发布时间】:2014-12-10 15:30:46 【问题描述】:

这是一个相当简单的任务,但我无法找到答案:

使用 Eigen 库,假设我有 Matrix2Xd matVector2d vec,其中

mat = 1 1 1
      1 1 1
vec = 2 2

现在我需要像 mat.addCol(vec) 这样的东西

mat = 1 1 1 2
      1 1 1 2

完成此任务的最佳(最简单)方法是什么?

请注意,这不是 How do you make a matrix out of vectors in eigen? 的副本。我不想初始化构造矩阵,而是附加到现有的矩阵。或者可能有一个技巧,在这种情况下如何使用逗号初始化?以下代码将失败:

Matrix2Xd mat(2,3);
Vector2d vec;
mat << 1, 1, 1, 1, 1, 1;
vec << 2, 2;

cout << mat << endl;
mat << vec;             // <-- crashes here
cout << mat << endl;

编辑:以下工作,但我不喜欢这样一个基本任务需要一个临时变量。有没有更好的办法?

Matrix2Xd tmp(2, mat.cols()+1);
tmp << mat, vec;
mat = tmp;

【问题讨论】:

您确实阅读了欺骗中的第一个答案:“矩阵 m mus 首先已正确调整大小。”?特征矩阵有一个 resize 成员函数...文档至少可以用谷歌搜索或阅读。 @rubenvb resize 不保留矩阵的内容。如果我做mat.resize(2, mat.cols()+1);,那么矩阵之后会填充一些随机值。 然后您需要创建一个临时文件或将其初始化为正确的大小。 @rubenvb 一开始不知道大小,所以这是不可能的。我希望有一个比将所有数据复制到临时更好的解决方案:/ 只是让你知道,这些函数很可能会重新分配内存,你只是从明显的角度“隐藏”了这个事实。参见例如this question 了解更多信息。 【参考方案1】:

您可以为此目的使用conservativeResize

mat.conservativeResize(mat.rows(), mat.cols()+1);
mat.col(mat.cols()-1) = vec;

【讨论】:

谢谢,这行得通。我发现甚至可以写mat.conservativeResize(NoChange, mat.cols()+1); 让行数保持不变。

以上是关于使用 Eigen 库将列附加到矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 withColumn 和 callUDF 将列附加到数据框

将列附加到新数据框

Python:将列附加到 PrettyTable 中的现有表

SQL Server:将列转换为另一个并将其值附加到单独的列

如何将列附加到列表中的 data.frames,其中该列应包含计算读取的那些 data.frames 的结构信息?

使用 Cupy 将数组附加到矩阵