2010-02-04 102 views
16

我有两个1000行1000列的大阵列。我需要比较这些数组的每个元素,并在相应的元素相等时将另一个数组存储1。如何比较两个数组的所有元素?

我可以用for循环做这件事,但这需要很长时间。我怎样才能更快地做到这一点?

+2

总是,总是矢量化MATLAB代码,如果可能的话。 – Doresoom 2010-02-04 20:12:45

+0

应该移到http://math.stackexchange.com/? – aaronsnoswell 2012-07-31 06:28:54

回答

12

如果两个矩阵AB大小都一样,那么你可以这样做:

index = A == B; 

index将是一个logical array与那些随处可见的AB一个元素都是平等的,否则为零。

一个字的警告...

如果AB包含整数,上面应该罚款。但是,如果它们包含浮点值,则可能会得到不希望的结果。上面的代码只有刚好等于的元素值为1。即使最小的差异也会导致元素被认为是不平等的。

有关处理“浮点运算的危险”的更多信息,请参阅this question's answers。一个解决办法是检查数组元素彼此是一个给定的公差范围内,像这样:

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

上述会给你的人随处可见A元素的逻辑阵列indexB不到0.0001彼此相反,否则为零。

+0

Matlab具有函数eps,描述为浮点相对精度。您可以在gnovice的代码中使用它来代替容差变量。 index = abs(A-B)<= eps; – yuk 2010-02-04 20:37:24

+0

eps是可以表示的最小值,不是吗?在这方面这不是非常有用。 – 2010-02-08 08:36:47

7

只需使用普通的==操作:

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

ans = 

    1  0 
    0  1 
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) 
+0

'isequal'有什么问题? – Jacob 2010-02-04 22:11:37

+4

尝试:'isequal(0.3,0.1 * 3)',相当于'0.3 == 0.1 * 3'。两者的答案都是错误的! – Amro 2010-02-04 22:23:29

+1

我的歉意 - 我想我对MATLAB的信心错位!我将不得不改变很多代码:( – Jacob 2010-02-04 23:14:42

相关问题