2010-03-11 3 views
4

J'ai trois tableaux de 1 d où les éléments sont des valeurs et je veux comparer chaque élément d'un tableau à tous les éléments des deux autres.MATLAB: comparer tous les éléments dans trois tableaux

Par exemple:

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

Je veux savoir s'il existe des mêmes valeurs dans différents tableaux (dans ce cas il y a 3,5,8)

Répondre

6

Le answer given by AB est correct, mais il est spécifique au cas où vous avez tableaux que vous comparez. Il existe une autre alternative qui s'adapte facilement à n'importe quel nombre de tableaux de taille arbitraire. La seule hypothèse est que chaque tableau individuel contient des valeurs uniques (à savoir non répété):

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

repeatedValues = 

    3 
    5 
    8 

Si les tableaux contiennent des valeurs répétées, vous devrez appeler UNIQUE sur chacun d'eux avant d'utiliser la solution ci-dessus.

1

définir ce que vous entendez par comparaison. Si les tableaux sont de la même longueur, et que vous comparez l'égalité, vous pouvez simplement faire foo == bar - c'est vectorisé. Si vous avez besoin de comparer dans le sens inférieur/supérieur, vous pouvez faire sign(foo-bar). Si les tableaux ne sont pas de la même longueur et/ou que vous ne comparez pas les éléments, veuillez préciser ce que vous voulez que la sortie de la comparaison soit. Par exemple,

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]) 

fait ce que vous demandez, mais il y a probablement une meilleure façon en fonction de ce que vous voulez en tant que sortie.

EDIT (OP clarifié question): Pour trouver des éléments communs dans les 3 tableaux, vous pouvez simplement faire:

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

les tableaux sont de la même longueur, et foo == bar ne fait pas ce que je veux, il ne compare que les éléments avec le même index, ce dont j'ai besoin est de comparer chaque élément d'un tableau avec chaque élément dans les deux autres – sasha

+1

, pour comparer par exemple tableaux foo et bar vous faites bsxfun (@ eq, foo ', bar) (ou bsxfun (@ (x, y) signe (xy), foo', bar) - cela vous donne une matrice où pour la rangée i, il compare ith élément de foo à tous les éléments de la barre –

5

Leo est presque droite, devrait être

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

ans = 
    3  5  8 

Je pense que cela fonctionne pour toutes les matrices.

+0

Hmm, je pense que j'aime le mieux de toutes les réponses +1 Cela fonctionne-t-il toujours? Regarde OK au premier coup d'oeil. – chappjc

Questions connexes