2010-03-11 123 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