2014-03-25 4 views
0

루프를 실행하려고 할 때 MatLab에서 문제가 발생했습니다. 루프의 각 반복에 대해 3x3 행렬에 대한 고유 값 및 고유 벡터가 계산됩니다 (행렬은 반복마다 다릅니다). 또한, 각 반복은 항상 [0 a 0] 형태의 하나의 고유 벡터를 산출해야하며, 중간 값, a만이 0이 아닙니다.루프 중에 MatLab의 0 값 읽기

이 경우 고유 벡터 행렬의 열 색인을 가져와야합니다. 이를 위해 나는 (매트릭스가 생성됩니다) 내 주요 루프에서 다음 루프를 설정 :

for i = 1:3 
    if (eigenvectors(1,i)==0) && (eigenvectors(3,i)==0) 
     index_sh = i 
    end 
end 

문제는 문제의 고유 벡터 행렬 때로는 형태의 출력이 것입니다 :

eigenvectors = 

    0.0000 0.6663 0.7457 
    -1.0000 0.0000 0.0000 
    -0.0000 -0.7457 0.6663 

그리고이 경우

는 매트랩은 어떤을 할당하지 않습니다

이 경우 내 코드가 잘 작동, 나는 그러나 index_sh = 3.를 얻을 수있는

eigenvectors = 

    -0.7310 -0.6824   0 
     0   0 1.0000 
    0.6824 -0.7310   0 
때때로 매트릭스의 형식은 이 경우 index_sh을 1과 같게 설정하되 index_sh 값으로 설정하십시오.

누구든지이 문제를 해결할 수있는 방법을 알고 있다면 MatLab이 0을 쓸 때 MatLab에서 값을 할당합니다. 0.0000 매우 감사하게 생각합니다!

+0

는 보통 float 정밀도의 문제처럼 보인다. 공차를 사용하십시오. http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab –

+0

을 참조하십시오. 어떻게 든이 일을 어떻게 처리 할 수 ​​있는지 아세요? – Kristian

+1

고유 벡터 (1, i) == 0.0을 사용해보십시오. 작동하는지 말해봐. 또 다른 옵션은 임의의 (eigenvectors (1, i))를 조건으로 사용하는 것입니다. 또한 귀하의 경우 요소가 0이 아닌 것으로 의심되므로 abs (eigenvectors (1, i)) <0.0000001 (매우 작은 숫자)과 같은 조건을 사용하는 것이 좋습니다 – freude

답변

2

"0.0000"은 정확히 0이 아닙니다. 그것을 해결하기 위해, 허용 오차를 선택하고 사용 0과 비교했을 때 : 당신의 코드에서

tol = 1e-6; 
index_sh = find(abs(eigenvectors(1,:))<tol & abs(eigenvectors(3,:))<tol); 

:

for ii = 1:3 
    if abs(eigenvectors(1,ii))<tol && abs(eigenvectors(3,ii))<tol 
     index_sh = i 
    end 
end 

또는 대신 허용, 당신은 누구의 첫번째 열을 선택할 수 - 그리고 제 3의 열 항목은 0에 가까운 :

[~, index_sh] = min(abs(eigenvectors(1,:)) + abs(eigenvectors(3,:))); 
+0

좋습니다. 이것은 놀라운 일을했습니다. 고마워요! – Kristian

+0

@Kristian Welcome :-) 허용치 사용을 피하는 편집 참조. –

+0

네, 알아 냈습니다. :) 다시 한 번 감사드립니다! – Kristian