我有三个1-d数组,其中元素是一些值,我想将一个数组中的每个元素与其他两个元素中的所有元素进行比较。
例如:
a=[2,4,6,8,12]
b=[1,3,5,9,10]
c=[3,5,8,11,15]
我想知道不同数组中是否有相同的值(在这种情况下有3,5,8)
答案 0 :(得分:6)
answer given by AB是正确的,但是当您正在比较 3 数组时,它是特定的。还有另一种替代方案可以轻松扩展到任意数量的任意大小的数组。唯一的假设是每个单独的数组包含唯一的(即非重复的)值:
>> allValues = sort([a(:); b(:); c(:)]); %# Collect all of the arrays
>> repeatedValues = allValues(diff(allValues) == 0) %# Find repeated values
repeatedValues =
3
5
8
如果数组包含重复值,则在使用上述解决方案之前,您需要在每个数组上调用UNIQUE。
答案 1 :(得分:5)
狮子座几乎是对的,应该是
unique([intersect(a,[b,c]), intersect(b,c)])
答案 2 :(得分:3)
c(ismember(c,a)|ismember(c,b)),
ans =
3 5 8
我认为这适用于所有矩阵。
答案 3 :(得分: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])
做你要求的,但根据你想要的输出,可能有更好的方法。
编辑(OP澄清问题): 要查找3个数组中的公共元素,您只需执行以下操作:
>> [intersect(a,[b,c]), intersect(b,c)]
ans =
8 3 5