2010-02-04 104 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

相關問題