2016-07-12 9 views
0

複雑なマトリックスの選択機能:固有:私は<code>Eigen</code>で書きたい、このMathWorks社のMATLABコードを持って

[V_K,D_K] = eig(K); 
d_k = diag(D_K); 
ind_k = find(d_k > 1e-8); 
d_k(ind_k) = d_k(ind_k).^(-1/2); 
K_half = V_K*diag(d_k)*V_K'; 

これまでのところ、私が書いたコードは(最後の部分は、this例以下基づいています)されます:

Eigen::EigenSolver<Eigen::MatrixXf> es (K,true); 
Eigen::MatrixXcf v = es.eigenvalues(); 
v = (v.array()).select(1/std::sqrt(v),v); 

これは(最初にすべての、あなたはEigen::MatrixXcfstd::sqrt(v)を適用することはできません)、明らかに間違っているが、私はそれを記述する方法を見つけ出すませんでした。手伝って頂けますか?

答えて

2

あなたはにリンクされている例のように、あなたは> 1e-8.array().real()?)を比較すると、行列の値を操作するEigens機能(またはunaryExpr)を使用する必要があります。本当にありがとうございましたを

v = (v.array().real() 
//   ^^^ 
//  can't compare complex numbers 

    > 1e-8) 
// ^^^ 
// Actually compare the number 
    .select(v.cwiseSqrt().cwiseInverse(), v); 
//   ^^^ 
//   Use Eigens functions or alternatively unaryExpr 

// In one line: 
v = (v.array().real() > 1e-8).select(v.cwiseSqrt().cwiseInverse(), v); 
+0

! 'unaryExpr'との違いを教えてください。 – justHelloWorld

+1

各値に適用される独自の関数を書くことができます。通常は、利用可能な場合はEigens関数を使用する方が良いです。ベクトル化と式テンプレートが可能です。 –

+0

説明をありがとう!あなたは[この](http://stackoverflow.com/questions/38327550/different-eigenvector-and-eigenvalues-in-eigen-and-matlab-could-generate-errors)の質問を見てくださいありますか? – justHelloWorld

関連する問題