我有矩阵例如: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
?谢谢你的帮助
答案 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)
。