在Matlab中比较两个矩阵

14

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

最好的方法是使用容差值进行比较,即对于每个矩阵元素,如果其绝对误差小于某个预定义的容差值,则认为这两个矩阵匹配。您可以通过比较每个元素之间的差异来计算绝对误差,并将其与预定义的容差值进行比较。例如,如果您选择一个容差值为0.05,则认为绝对差异小于0.05的元素匹配。


2
这个问题很老了,但从数学上讲,你应该使用 norm(A-B)/norm(A),而不是下面的解决方案。 - rlbond
6个回答

13

试一下这个:

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

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

如果您想询问它们是否全都是true(它们都满足上述条件):

all(tf(:))

我确实想要更好的答案。 - bastijn
1
你不需要在这里加上绝对值吗? - Jim

5

修改Edric的解决方案:

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如果任何元素的绝对误差或相对误差大于您选择的容差,则将为false。此外,如果x的任何元素恰好为0,则relError的某些元素可能会变成无穷大或非数字,因此我使用ISFINITE函数将它们设置为0以忽略这些值。
我不建议使用IMAGESC进行比较,因为1)在显示时缩放数据,2)用于显示的色图具有离散数量的颜色值(默认情况下为256,因此存在大量舍入),3)颜色的微小变化可能对两个图的视觉比较并不明显。

4

我建议在计算中使用绝对误差和相对误差:

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()函数将它们绘制出来进行目测比较时,它们看起来非常相似。因此,我仍然不太确定应该怎么处理这个问题。 - stanigator

1

当x和y中有非常小的值对时,即使这些值本身可以忽略不计,结果也会返回0。因此,可以添加以下内容来补充已接受的解决方案:

relError(x < absTol) = 0;

这样可以用于丢弃非常小的误差,从而不考虑这些值的相对误差。


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

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

-2

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


1
请注意,op明确表示isequal无法工作,因为存在错误。 - Gustavo Litovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接