例如,我有矩阵: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
? 感谢帮助
虽然我也会使用 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)
。
我能想到的最好的是:
Eigen::MatrixXd newC(C.rows()+1, C.cols()+1);
newC << v.transpose(), v.tail(v.size()-1), C;
C.swap(newC);
这假设您的“新向量”作为列向量存储在v
. newC
在此片段之后不再需要该变量。