使用 Eigen 库将列附加到矩阵
Posted
技术标签:
【中文标题】使用 Eigen 库将列附加到矩阵【英文标题】:Append column to matrix, using Eigen library 【发布时间】:2014-12-10 15:30:46 【问题描述】:这是一个相当简单的任务,但我无法找到答案:
使用 Eigen 库,假设我有 Matrix2Xd mat
和 Vector2d 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:将列转换为另一个并将其值附加到单独的列