使用Eigen库将列追加到矩阵中

24
这是一个相当简单的任务,但我找不到它的答案:
使用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

这要怎么做才是最好(最简单)的方法?
请注意,这不是如何在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;

1
你有读过重复问题中的第一个答案吗:“矩阵m必须先被正确地调整大小。”?Eigen矩阵有一个resize成员函数...文档可以通过谷歌搜索或者至少阅读一下。 - rubenvb
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - luator
@rubenvb 开始时大小未知,因此不可能。我希望有比将所有数据复制到临时位置更好的解决方案:/ - luator
没有一种数据结构(在内存中连续的,就像数值矩阵所需的一样)能够满足您的需求。我们在讨论什么大小? - rubenvb
1
只是让你知道,那些函数很可能会重新分配内存,你只是将这个事实“隐藏”起来了。请参见例如此问题以获取更多信息。 - rubenvb
显示剩余2条评论
1个回答

39

你可以使用conservativeResize来实现这个目的:

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

14
谢谢,这个方法可行。我发现甚至可以写成 mat.conservativeResize(NoChange, mat.cols()+1);,这将保持行数不变。 - luator
从性能角度来看,这种方法是否值得推荐?据我所知,conservativeResize()会重新分配内存并将旧数据复制到新位置。假设我们需要将多个向量附加到矩阵中,那么这种方法是否会显著降低性能? - Bo Tian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接