2014-10-08 61 views
1

我想寫一個函數使用Eigen反轉對角線矩陣有點不同於平時。當對角元素爲零(或相對接近零)時,它應該將對角線元素的值設置爲零,否則值應該是1 /(對應元素)。我試着寫接收,我想顛倒對角矩陣的函數(它實際上是一個NX1矩陣,因此得名)和另一個指針,在這裏我想放的結果:如何使用特徵在函數中訪問/寫入矩陣?

template <typename m1, typename m2> 
void invertSingularValues(Eigen::EigenBase<m1>& sing_val_vector,Eigen::EigenBase<m2>& res) 
{ 
    for (int i=0; i<sing_val_vector.rows();i++) 
     res(i,i)=(sing_val_vector[i]<0.0000001?0:1/sing_val_vector[i]); 
}; 

它似乎我不能通過使用(i,j)或[i]訪問矩陣的元素,因爲我得到這個錯誤:

'operator []'不匹配(操作數類型是'Eigen :: EigenBase >'和'int') res(i,i)=(sing_val_vector [i] < 0.0000001-0:1/sing_val_vector [i]);

沒有匹配關於 '操作符[]'(操作數的類型是 '本徵:: EigenBase>' 和 'INT') RES(I,I)=(sing_val_vector [I] < 0.0000001?0:1/sing_val_vector [一世]);

敵不過調用 '(本徵:: EigenBase>)(INT &,整數&)' RES(I,I)=(sing_val_vector [I] < 0.0000001?0:1/sing_val_vector [I]) ;

當我調用該函數是這樣的:

invertSingularValues(S.data,S_inv); 

S.data和S_inv是本徵矩陣。 我能做什麼?

回答

1

正如編譯器所說,當res屬於EigenBase類型時,您不能執行res(i,i),因爲EigenBase沒有定義此功能。您需要使用更具體的類,如MatrixBase或DenseBase。

相關文章:

忽略任何代碼的優化,像這樣的工作:

template <typename m1, typename m2> 
void invertSingularValues(Eigen::MatrixBase<m1>& sing_val_vector,Eigen::MatrixBase<m2>& res) 
{ 
    for (int i(0); i < sing_val_vector.rows(); i++) 
     for (int j(0); j < sing_val_vector.cols(); j++) 
      res(i,j) = sing_val_vector(i,j) < 1e-07 ? 0.0 : 1.0/sing_val_vector(i,j); 
};