4

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

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

矩阵 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? 感谢帮助

4

2 回答 2

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矩阵调整为 size时(M*k)x(N/k)

于 2013-03-20T16:25:43.777 回答
3

我能想到的最好的是:

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

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

于 2013-03-11T09:39:58.730 回答