MATLAB: сравнение всех элементов в трех массивах - PullRequest
4 голосов
/ 11 марта 2010

У меня есть три 1-d массива, где элементы - это некоторые значения, и я хочу сравнить каждый элемент в одном массиве со всеми элементами в двух других.

Например:

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

Я хочу знать, есть ли одинаковые значения в разных массивах (в данном случае 3,5,8)

Ответы [ 4 ]

6 голосов
/ 11 марта 2010

Ответ , данный 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 для каждого из них, прежде чем использовать вышеуказанное решение.

5 голосов
/ 11 марта 2010

Лев почти прав, должно быть

unique([intersect(a,[b,c]), intersect(b,c)])
3 голосов
/ 14 февраля 2014
c(ismember(c,a)|ismember(c,b)),

ans =
     3     5     8

Я думаю, что это работает для всех матриц.

1 голос
/ 11 марта 2010

Определите, что вы подразумеваете под сравнением. Если массивы имеют одинаковую длину, и вы сравниваете равенство, тогда вы можете просто сделать 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])

делает то, что вы просите, но, возможно, есть лучший способ, в зависимости от того, что вы хотите получить.

РЕДАКТИРОВАТЬ (уточненный вопрос): Чтобы найти общие элементы в 3 массивах, вы можете просто сделать:

>> [intersect(a,[b,c]), intersect(b,c)]
ans =
     8     3     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...