2014-10-01 70 views
2

我想寫一個方法,檢查矩陣是否正交,如果它是或否則返回TRUE如果它不是我的問題是,我isequal ()不工作,我想如何。基本上我可以根據兩個公式進行兩種檢查:isequal()和==用於比較矩陣不能正常工作matlab

一種方法是檢查矩陣R的轉置是否等於矩陣R的倒數。如果它們相等,則它是正交的。 (R'= inv(R))

另一種方法是檢查並查看矩陣R乘以矩陣R的轉置是否等於R的單位矩陣。(R'R = I)如果是,則矩陣是正交的。我最常用的是isequal(),但它保持錯誤。有人可以看我的代碼,並告訴我爲什麼會這樣嗎?

我用Z =正高(randn(3,3))來產生隨機正交矩陣和我打電話給我的方法isortho(Z)

function R = isortho(r) 
%isortho(R), which returns true if R is orthogonal matrix, otherwise returns false. 
    if ismatrix(r) && size(r,1)==size(r,2) %checks if input is square matrix 
     '------' 
     trans=transpose(r) 
     inverted=inv(r) 
     isequal(trans,inverted) 
     trans==inverted 
     isequal(transpose(r),inv(r)) %METHOD ONE 

     i=size(r,1); 
     I=eye(i) %creating Identity matrix based on size of r 
     r*transpose(r) 
     r*transpose(r)==I %METHOD TWO 



     %check if transpose of r is times inverse of r equals Identity matrix of r 
     if (r*transpose(r)==I) 
      R= 'True'; 
     else 
      R= 'False'; 
     end 
    end  
end 

這是我的輸出:

>> isortho(Z) 

ans = 
------ 

trans = 
    -0.2579 -0.7291 -0.6339 
    0.8740 0.1035 -0.4747 
    0.4117 -0.6765 0.6106 

inverted = 
    -0.2579 -0.7291 -0.6339 
    0.8740 0.1035 -0.4747 
    0.4117 -0.6765 0.6106 

ans = ////isequal(trans,inverted) which yielded 0 false 
    0 

ans = ////trans==inverted 
    0  1  0 
    1  0  0 
    0  1  1 

ans =  ////isequal(transpose(r),inv(r)) 
    0 

I = 
    1  0  0 
    0  1  0 
    0  0  1 

ans = 
    1.0000   0 0.0000 
     0 1.0000 0.0000 
    0.0000 0.0000 1.0000 

ans = 
    1  1  0 
    1  1  0 
    0  0  1 

ans = 
False 
>> 

有人可以幫我解決這個問題,或者告訴我爲什麼isequal()失敗時矩陣倒置和反式似乎是相同的?

+1

您正遇到計算機精度問題,請參閱例如:http://matlabgeeks.com/tips-tutorials/floating-point-comparisons-in-matlab/。你可以嘗試類似'if abs(norm(transpose(r)-inv(r))) David 2014-10-01 06:08:58

+0

另請參閱[這裏](http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab)。儘管你沒有解決方案。也許用符號數學工具箱來做? – thewaywewalk 2014-10-01 06:10:01

回答

4

正如評論中所述,您遇到了計算機精度問題。詳情請參閱Why is 24.0000 not equal to 24.0000 in MATLAB?http://matlabgeeks.com/tips-tutorials/floating-point-comparisons-in-matlab/。這不是一個Matlab特有的東西,它是一個計算機的東西,你只需要處理它。

就你而言,你試圖看看兩件事情是否相等,但這兩件事情是大量浮點運算的結果。所以他們幾乎不會完全一樣,但應該總是非常接近。因此,設定一個寬容,說1E-12,並說兩件事情都是平等的,如果他們的差別的一些措施是容忍更低,如:

norm(r.'-inv(r))<tol 

其中發現之間的差別的2-範兩個矩陣,然後如果它小於tol,則這將評估爲1,或者爲true。

如果我設置tol=1e-12,那麼一切正常。如果我設置tol=1e-15,一切正常。但是如果我設置tol=1e-16,那麼一切都停止了!這是因爲計算機預校準錯誤的數量大於1e-16,所以norm(r.'-inv(r))的答案不能準確到該容差。最小量的Matlab可以在我的計算機上區分大致爲2.2x10 ^( - 16),因此您必須確保您的容差遠遠高於此值。當然,設置tol太大意味着你說一些非正交矩陣是正交的,但我不希望tol=1e-14給你任何重要的問題。