我正在尝试编写一个方法来检查矩阵是否正交,如果正交则返回 TRUE,如果不是则返回 FALSE 我的问题是我的 isequal() 没有按照我想要的方式工作。基本上我可以根据两个公式以两种方式进行检查:
一种方法是检查矩阵 R 的转置是否等于矩阵 R 的逆矩阵。如果它们相等,则它是正交的。 (R'=inv(R))
另一种方法是检查矩阵 R 乘以矩阵 R 的转置是否等于 R 的单位矩阵。 (R'R=I) 如果是,则矩阵是正交的。我一直在使用 isequal() 但它总是产生 false。有人可以看看我的代码并告诉我为什么会这样吗?
我使用 Z=orth(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
>>
有人可以帮我解决这个问题,或者告诉我为什么当矩阵反转和 trans 看起来相同时 isequal() 会失败吗?
最佳答案
正如评论中所述,您遇到了计算机精度问题。欲了解更多详情,请参阅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
会给您带来任何重大问题.
关于matlab - isequal() 和 == 用于比较矩阵无法正常工作 matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135052/