【问题标题】:Comparing two matrices in Matlab在 Matlab 中比较两个矩阵
【发布时间】:2010-10-30 14:38:54
【问题描述】:

我有两个矩阵 x 和 y,它们都是来自不同算法/例程的结果,它们应该计算相同的结果。虽然我知道 isequal() 会检查 x 和 y 是否是同一个矩阵,但这些矩阵中的条目不会完全相同(即,在最坏的情况下,某些条目可能会有 5% 的折扣)。在这种情况下,比较它们以查看它们是否足够接近以被视为相同结果的最佳方法是什么?提前感谢您的建议。

【问题讨论】:

  • 这个问题已经很老了,但在数学上你会想使用norm(A-B)/norm(A),而不是下面的解决方案。

标签: matlab comparison floating-point matrix


【解决方案1】:

对于包含浮点值的矩阵 x 和 y,您可以检查数组元素是否在彼此的给定容差范围内。 示例代码:

tol = 0.05;

result = abs(x - y) <= tol;

【讨论】:

    【解决方案2】:

    使用 'isequal(a,b) 其中 a 和 b 是两个矩阵,如果为 1 则为真

    【讨论】:

    • 请注意,op 明确表示 isequal 不起作用,因为存在错误。
    【解决方案3】:

    当 x 和 y 中有非常小的值对时,结果将返回 0,尽管这些值本身是可忽略的。所以,除了接受的解决方案

    relError(x 
    
    

    可用于丢弃非常小的错误。因此,这些值不考虑相对误差。

    【讨论】:

      【解决方案4】:

      修改Edric's解决方案:

      absTol = 1e-3;   % You choose this value to be what you want!
      relTol = 0.05;   % This one too!
      absError = x(:)-y(:);
      relError = absError./x(:);
      relError(~isfinite(relError)) = 0;   % Sets Inf and NaN to 0
      same = all( (abs(absError) < absTol) & (abs(relError) < relTol) );
      

      如果或者绝对任何元素的相对误差大于您选择的任何容差,则变量same将为假。此外,如果 x 的任何元素恰好为 0,那么 relError 的某些元素最终可能是无限或非数字,所以我使用ISFINITE 函数通过将这些值设置为 0 来忽略它们。

      我不建议使用IMAGESC 来比较绘图,因为 1) 数据在显示时会按比例缩放,2) 显示器的颜色图具有离散数量的颜色值(我认为默认情况下为 256 ,因此有很多四舍五入),以及 3) 颜色的细微变化可能从两个图的视觉比较中并不那么明显。

      【讨论】:

        【解决方案5】:

        试试这个:

        tf = abs((A-B)./B)<0.05
        

        这将返回一个逻辑矩阵,如果 A 和 B 相对于 B 的相对差异小于 5%,则该逻辑矩阵对于每个元素都为真。

        如果要问这些是否都为真(都满足上述条件):

        all(tf(:))
        

        【讨论】:

        • 一个更好的回答我确实。
        • 这里不需要绝对值吗?
        • 是的,我现在已经添加了。谢谢。
        【解决方案6】:

        我会考虑以绝对容差和相对容差来做这样的事情:

        function same = tol( x, y )
        absTol = 1e-3;
        relTol = 0.05;
        errVec = abs( x(:) - y(:) );
        same = all( (errVec < absTol) | (errVec./x(:) < relTol) );
        

        【讨论】:

        • 我尝试了 Edric 和 Andrew 的方法。即使我从函数中得到的输出为假,但当我通过使用 imagesc() 函数绘制它们来直观地比较这两个结果时,它们看起来非常相似。因此,我仍然不太确定该怎么做。
        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        相关资源
        最近更新 更多