2013-03-09 64 views
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?感謝您的幫助

回答

3

我能想出的最好的是:

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

這裏假設你的「新載體」存儲爲v的列向量。此片段後不再需要變量newC

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)時。