2010-03-11 98 views
4

我有三個一維數組,其中元素是一些值,我想比較一個數組中的每個元素與其他兩個元素中的所有元素。MATLAB:比較三個數組中的所有元素

例如:

a=[2,4,6,8,12] 
b=[1,3,5,9,10] 
c=[3,5,8,11,15] 

我想知道是否有不同的陣列相同的值(在這種情況下,有3,5,8)

回答

6

answer given by AB是是正確的,但它是特定於您正在比較的數組的情況。還有另一種方法可以輕鬆擴展到任意數量的任意大小的數組。唯一的假設是,每個單獨的陣列中含有唯一的(即,非重複)值:

>> allValues = sort([a(:); b(:); c(:)]); %# Collect all of the arrays 
>> repeatedValues = allValues(diff(allValues) == 0) %# Find repeated values 

repeatedValues = 

    3 
    5 
    8 

如果陣列包含重複值的,則需要使用上述溶液之前調用每個他們的UNIQUE

1

定義您通過比較的意思。如果數組的長度相同,並且您比較相等,那麼您只需執行foo == bar - 它是向量化的。如果您需要比較小於/大於意義,則可以執行sign(foo-bar)。如果數組的長度不同並且/或者您沒有比較元素 - 請說明您希望輸出的比較結果。例如,

foo = 1:3; 
bar = [1,2,4]; 
baz = 1:2; 
sign(repmat(foo',1,length([bar,baz])) - repmat([bar, baz],length(foo),1)) 
# or, more concisely: 
bsxfun(@(x,y)sign(x-y),foo',[bar,baz]) 

做你要求的,但可能有更好的方法取決於你想要的輸出。

EDIT(OP澄清的問題): 要找到在3個陣列共同的元素,你可以簡單地做:

>> [intersect(a,[b,c]), intersect(b,c)] 
ans = 
    8  3  5 
+0

數組的長度相同,並且foo == bar不能做我想做的事情,它只比較具有相同索引的元素,我需要的是將一個數組中的每個元素與另外兩個元素中的每個元素進行比較 – sasha 2010-03-11 13:37:04

+1

在這種情況下,比較例如數組foo和bar你做bsxfun(@ eq,foo',bar)(或者bsxfun(@(x,y)sign(xy),foo',bar) - 這會給你一個矩陣,對於第i行,它比較第i個元素是foo的所有元素的吧 – 2010-03-11 13:42:23

5

獅子座是差不多吧,應該是

unique([intersect(a,[b,c]), intersect(b,c)]) 
3
c(ismember(c,a)|ismember(c,b)), 

ans = 
    3  5  8 

我認爲這適用於所有矩陣。

+0

嗯,我想我喜歡所有答案中最好的+1 +1它總是有效嗎?第一眼看起來沒問題。 – chappjc 2014-02-14 01:32:18