2014-03-25 116 views
0

我在嘗試運行循環時遇到了MatLab中的問題。對於循環中的每次迭代,計算3×3矩陣的特徵值和特徵向量(矩陣隨着每次迭代而不同)。此外,每次迭代應始終產生一個形式爲[0 a 0]的特徵向量,其中只有中間值a非零。在循環中讀取MatLab中的零值

我需要獲取特徵向量矩陣的列的索引,在這裏發生這種情況。要做到這一點,我建立了我的主環內的以下環(其中生成矩陣):

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

的問題是,有問題的特徵向量矩陣有時會具有以下形式的輸出:

eigenvectors = 

    -0.7310 -0.6824   0 
     0   0 1.0000 
    0.6824 -0.7310   0 

在這種情況下我的代碼工作得很好,我也得到index_sh = 3.但是,有時矩陣的形式爲:

eigenvectors = 

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

在這種情況下,MATLAB不指定任何值爲index_sh,即使我想在這種情況下index_sh等於1。

如果有人知道我該如何解決這個問題,那麼MatLab也會在零寫入時賦值爲0.0000我將不勝感激!

+0

看起來像通常的浮動精度問題。使用容差。見http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab –

+0

謝謝。你知道我可以怎樣解決這個問題嗎? – Kristian

+1

嘗試使用特徵向量(1,i)== 0.0。告訴我它是否有效。另一種選擇是使用任何(特徵向量(1,i))作爲條件。我也懷疑你的情況下的元素非零,所以我最好使用像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 

或者,而不是寬容,你可以選擇它的第一列 - 和第三行條目更接近於0:

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

太好了。這工作奇蹟。非常感謝! – Kristian

+0

@Kristian歡迎:-)查看編輯,避免使用公差 –

+0

是的,我注意到了:)。再次感謝! – Kristian