我想寫一個方法,檢查矩陣是否正交,如果它是或否則返回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()失敗時矩陣倒置和反式似乎是相同的?
您正遇到計算機精度問題,請參閱例如:http://matlabgeeks.com/tips-tutorials/floating-point-comparisons-in-matlab/。你可以嘗試類似'if abs(norm(transpose(r)-inv(r)))
David
2014-10-01 06:08:58
另請參閱[這裏](http://stackoverflow.com/questions/686439/why-is-24-0000-not-equal-to-24-0000-in-matlab)。儘管你沒有解決方案。也許用符號數學工具箱來做? – thewaywewalk 2014-10-01 06:10:01