在矩阵Eigen中的零位添加行和列

时间:2013-03-09 20:10:25

标签: vector matrix eigen

我有矩阵例如:C(400,400)

我希望用一个向量来增长这个矩阵:矩阵的开始索引0处的这个矩阵的行和列,例如:

Matrix C:

 3 2 5 
 4 5 6
 7 8 20

我的新载体:25 5 6 8

结果:

  25 5 6 8
  5  3 2 5 
  6  4 5 6
  8  7 8 20

这是Eigen的最佳方式吗?使用.resize().set?谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

我能想到的最好的是:

Eigen::MatrixXd newC(C.rows()+1, C.cols()+1);
newC << v.transpose(), v.tail(v.size()-1), C;
C.swap(newC);

这假设您的“新向量”存储为v中的列向量。此片段后不再需要变量newC

答案 1 :(得分:3)

虽然我也会使用Jitse的方法,为了给你另一个选择,这里有一个更冗长的解决方案,可能会更好地显示部件的位置:

Eigen::MatrixXd newC(C.rows()+1, C.cols()+1);
newC.topRows<1>() = v.transpose();
newC.leftCols<1>() = v;
newC.bottomRightCorner(C.rows(),C.cols()) = C;
C.swap(newC)

请注意,这会将左上角的元素分配两次;如果你不想那样,用这个丑陋的那一行替换第三行:

newC.topRows<1>().tail(v.size()-1) = v.transpose().tail(v.size()-1);

最后请注意为什么我们不使用resize:它总是抛弃你的矩阵内容(即使缩小矩阵),除非元素的数量保持完全相同,即当你将MxN矩阵的大小调整为(M*k)x(N/k)