如何比较两个数组的所有元素?

时间:2010-02-04 19:45:20

标签: matlab comparison matrix vectorization

我有两个大数组,大约有1000行和1000列。我需要比较这些数组的每个元素,如果相应的元素相等,则将1存储在另一个数组中。

我可以使用for循环执行此操作,但这需要很长时间。我怎么能更快地做到这一点?

3 个答案:

答案 0 :(得分:29)

给出的答案都是正确的。我只是想详细说明关于浮点测试的gnovice's评论。

当比较浮点数的相等性时,必须使用容差值。通常使用两种类型的公差比较:绝对公差和相对公差。 (source

ab的绝对容差比较如下:

|a-b| < tol

相对容差比较如下:

|a-b| < tol*max(|a|,|b|) + tol_floor

您可以将上述两个实现为匿名函数:

%# absolute tolerance equality
isequalAbs = @(x,y,tol) ( abs(x-y) <= tol );

%# relative tolerance equality
isequalRel = @(x,y,tol) ( abs(x-y) <= ( tol*max(abs(x),abs(y)) + eps) );

然后您可以将它们用作:

%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)

答案 1 :(得分:12)

如果您的两个矩阵AB大小相同,那么您可以这样做:

index = A == B;

index将是logical array,其中AB的元素相等,否则为零。

一句警告......

如果AB包含整数,则上述情况应该没问题。但是,如果它们包含浮点值,则可能会得到不希望的结果。对于完全相等的元素,上面的代码只有一个值。即使是最小的差异也会导致元素被认为是不相等的。

您可以查看this question's answers以获取有关处理“浮点运算的危险”的更多信息。一种解决方案是检查数组元素是否在给定的容差范围内,如下所示:

tolerance = 0.0001;
index = abs(A-B) <= tolerance;

上面的内容将为您提供一个逻辑数组index,其中包含AB的元素彼此在0.0001之内,否则为零。

答案 2 :(得分:7)

只需使用普通==运算符:

>> [1 2; 3 4] == [1 5; 6 4]      

ans =

     1     0
     0     1