matlab - isequal() 和 == 用于比较矩阵无法正常工作 matlab

标签 matlab matrix equals equality

我正在尝试编写一个方法来检查矩阵是否正交,如果正交则返回 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/

相关文章:

当股息提高到一个幂时,matlab 错误的模数结果

matrix - 如何在 Eigen 中展开矩阵?

c# - Assert.ReferenceEquals() 在 Visual Studio 测试中通过 Object.ReferenceEquals() 返回 'false'

java - equals方法中身份测试的必要性

matlab - 如何在 MATLAB 中创建抽象类对象数组?

matlab - 在字符串周围添加方括号

matlab - 在不修改 Matlab 脚本的情况下禁用 Matlab 焦点窃取

java - 使用 Spring 框架在矩阵中直接注入(inject) double 值

python - 计算 250k 列表成对相似度的最有效方法

java - 将用户输入与字符串进行比较