在Matlab中比较两个矩阵

时间:2009-06-02 07:06:51

标签: matlab comparison floating-point matrix

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

6 个答案:

答案 0 :(得分:13)

试试这个:

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

如果A和B之间相对于B的相对差异小于5%,这将返回一个逻辑矩阵,对于每个元素都是如此。

如果您想询问所有这些是否属实(它们都满足上述条件):

all(tf(:))

答案 1 :(得分:5)

修改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) );

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

我不建议使用IMAGESC来比较绘图,因为1)数据在显示时被缩放,2)显示器的颜色图具有离散数量的颜色值(我认为是256默认情况下,因此大量的舍入)和3)颜色的细微变化可能不会从两个图的视觉比较中显而易见。

答案 2 :(得分:4)

我会考虑做一些具有绝对容忍度和相对容忍度的事情:

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

答案 3 :(得分:1)

如果x和y中的值对非常小,则结果将返回0,尽管这些值本身是可忽略的。因此,对已接受的解决方案的补充

relError(x < absTol) = 0;

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

答案 4 :(得分:0)

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

tol = 0.05;

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

答案 5 :(得分:-2)

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