2016-12-23 3 views
3

すべてゼロ要素である列または行を削除する方が効率的な方法があるのだろうかと思っていました。固有ライブラリに関数を使用していると確信していますが、どうすればよいか分かりません。固有値を使用してゼロの列または行を削除する

今のところ私はそういうことをしていますが、whileループの考え方では、ゼロに合計する複数の行/列がある場合に使用されています。範囲制限を超過したり、ゼロ行を渡したくありません。 (それは固有3.4のために計画されているが)

void removeZeroRows() { 
    int16_t index = 0; 
    int16_t num_rows = rows(); 

    while (index < num_rows) { 
     double sum = row(index).sum(); 
     // I use a better test if zero but use this for demonstration purposes 
     if (sum == 0.0) { 
      removeRow(index); 
     } 
     else { 
      index++; 
     } 

     num_rows = rows(); 
    } 
} 

答えて

2

現在(アイゲン3.3)は、このためには直接的な機能はありません。

一方、このようなものを使用することができます(もちろん、rowcolを交換することができるが、出力は単に例示のためのものである):

Eigen::MatrixXd A; 
A.setRandom(4,4); 
A.col(2).setZero(); 

// find non-zero columns: 
Eigen::Matrix<bool, 1, Eigen::Dynamic> non_zeros = A.cast<bool>().colwise().any(); 

std::cout << "A:\n" << A << "\nnon_zeros:\n" << non_zeros << "\n\n"; 

// allocate result matrix: 
Eigen::MatrixXd res(A.rows(), non_zeros.count()); 

// fill result matrix: 
Eigen::Index j=0; 
for(Eigen::Index i=0; i<A.cols(); ++i) 
{ 
    if(non_zeros(i)) 
     res.col(j++) = A.col(i); 
} 

std::cout << "res:\n" << res << "\n\n"; 

一般的に、あなたはすべての反復で行列をリサイズ避けるが、サイズを変更する必要がありますそれはできるだけ早く最終的なサイズに。

MATLAB /オクターブに相当します
Eigen::MatrixXd res = A("", A.cast<bool>().colwise().any()); 

res = A(:, any(A)); 
+1

が利用でき、この固有3.4のコードですアイゲンこれに似た3.4何かできるようになります(構文はまだ最終ではない)で

私はこの1行の機能を活用するために開発ブランチにアップグレードすることができますどこに? – Lobstw

+0

非ゼロの代わりに非NANをチェックする方法は? – Pedro77

関連する問題