2016-07-12 1 views
0

복잡한 매트릭스에 선택 기능 :아이겐 : 나는 <code>Eigen</code>에서 작성하려는이 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::MatrixXcfstd::sqrt(v)을 적용 할 수 없습니다) 분명히 잘못된 것입니다,하지만 난 그것을 작성하는 방법을 알아낼하지 않았다

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