Подтвердить что ты не робот

Найти индексы элементов в массиве на основе поиска из другого массива

Представьте, что у меня есть два массива:

a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0];

b = [5, 9, 6];

Я хочу найти индексы значений b в (только первый удар), т.е.

c = [3, 6, 5];

Есть ли простой способ Matlab, чтобы сделать это без циклов и поиска.

Я попытался использовать find() с помощью:

find(a == b)

и это сработает, если вы это сделаете:

for i = 1:length(b)
    index = find(a == b(i));
    c = [c, index(1)]
end

Но было бы идеально, если бы это было легче, чем это.

4b9b3361

Ответ 1

Это фактически встроено в ismember. Вам просто нужно установить правильный флаг, затем это один лайнер, и вам не нужен массив. Версии, более новые, чем R2012b, используют это поведение по умолчанию.

Первоначально ismember вернул бы последнее появление, если их несколько, флаг R2012a заставляет его вернуть первый.

Здесь мои результаты тестирования:

a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0, 6];
b = [5, 9, 6];

[~,c] = ismember(b,a,'R2012a');
>> c
c =
     3     6     5

Ответ 2

Вы можете легко скомпилировать цикл for с помощью массива в простой однострочный интерфейс:

arrayfun(@(x) find(a == x,1,'first'), b )

также см. Scenia answer для более поздних версий matlab ( > R2012b).

Ответ 3

Это исправление подхода ismember, предложенного @Pursuit. Таким образом, он обрабатывает несколько вхождений одного из чисел и возвращает результат в правильном порядке:

[tf,loc] = ismember(a,b);
tf = find(tf);
[~,idx] = unique(loc(tf), 'first');
c = tf(idx);

Результат:

>> c
c =
     3     6     5

Ответ 4

a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0, 6];
b = [5, 9, 6];
[r c]=find(bsxfun(@eq,a,b')');
[~,ia,~]=unique(c,'first');
>> r(ia)

ans =

     3
     6
     5

Примечание. Я добавил дополнительный 6 в конце a, чтобы продемонстрировать только первое вхождение каждого значения.

Ответ 5

Вы можете попробовать следующее:

[c,ind_a] = intersect(a,b)

Ответ 6

Вы пробовали ismember?

c_logical_mask = ismember(a, b);

или

c_indexes = find(ismember(a, b));

Ответ 7

a = [1, 2, 5, 7, 6, 9, 8, 3, 4, 7, 0];
b = [5, 9, 6];
c = dsearchn(a',b');

Matlab требует, чтобы a и b должны были быть векторами столбцов, поэтому транспонировать.

Ответ 8

Как и @tmpearce answer, но, возможно, быстрее:

[valid, result] = max(bsxfun(@eq, a(:), b(:).')); %'// max finds first occurrence
result = result(valid); %// this is necessary in case some value of b is not in a