我有兩個1000行1000列的大陣列。我需要比較這些數組的每個元素,並在相應的元素相等時將另一個數組存儲1。如何比較兩個數組的所有元素?
我可以用for循環做這件事,但這需要很長時間。我怎樣才能更快地做到這一點?
我有兩個1000行1000列的大陣列。我需要比較這些數組的每個元素,並在相應的元素相等時將另一個數組存儲1。如何比較兩個數組的所有元素?
我可以用for循環做這件事,但這需要很長時間。我怎樣才能更快地做到這一點?
如果兩個矩陣A
和B
大小都一樣,那麼你可以這樣做:
index = A == B;
和index
將是一個logical array與那些隨處可見的A
和B
一個元素都是平等的,否則爲零。
一個字的警告...
如果A
和B
包含整數,上面應該罰款。但是,如果它們包含浮點值,則可能會得到不希望的結果。上面的代碼只有剛好等於的元素值爲1。即使最小的差異也會導致元素被認爲是不平等的。
有關處理「浮點運算的危險」的更多信息,請參閱this question's answers。一個解決辦法是檢查數組元素彼此是一個給定的公差範圍內,像這樣:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
上述會給你的人隨處可見A
元素的邏輯陣列index
和B
不到0.0001彼此相反,否則爲零。
Matlab具有函數eps,描述爲浮點相對精度。您可以在gnovice的代碼中使用它來代替容差變量。 index = abs(A-B)<= eps; – yuk 2010-02-04 20:37:24
eps是可以表示的最小值,不是嗎?在這方面這不是非常有用。 – 2010-02-08 08:36:47
只需使用普通的==
操作:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1
給出的答案是正確的。我只想詳細說明關於浮點測試的一些注意事項gnovice's。
當比較浮點數的相等性時,有必要使用容差值。通常使用兩種類型的容差比較:絕對容差和相對容差。 (source)
的a
和b
絕對公差比較樣子:
|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)
總是,總是矢量化MATLAB代碼,如果可能的話。 – Doresoom 2010-02-04 20:12:45
應該移到http://math.stackexchange.com/? – aaronsnoswell 2012-07-31 06:28:54