Santhan Salai дал скорректированный ответ если вы хотите придерживаться цикла s. Тем не менее, для повышения эффективности, можно добиться того, что вы хотите с bsxfun
и sum
, если вы не хотите, чтобы петля:
>> B = [ 1 2 1 4 5 2 2 ];
>> C = [ 1 2 ];
>> D = sum(bsxfun(@eq, B, C.'), 2)
D =
2
3
bsxfun
хороший инструмент, который позволяет транслировать данные по одноэлементных размеров. В нашем случае я использовал функции equals
, чтобы проверить равенство по элементам, и я транспонировал C
так, чтобы он стал вектором столбца. Будет создано матрица, в которой у нас будет столько строк, сколько есть в C
, и столько столбцов, сколько есть в B
. Каждая строка этой выходной матрицы сообщает вам, какие элементы были равны каждому соответствующему элементу в C
. C
является транслировался таким образом, что мы получаем матрицу кучи [1;2]
колонн делают пюре вместе стольких элементов, сколько в B
и B
транслируется таким образом, что мы получаем повторы B
с таким количеством строк, что в C
. Посредством элементарного равенства мы создадим логическую матрицу, в которой каждый элемент строки сообщает вам, какие элементы были равны соответствующему значению C
. Все, что вам нужно сделать, это суммирование по столбцам, чтобы узнать, сколько элементов было равным каждому значению в C
, поэтому вызов sum
во втором измерении.
Если вы хотите излишеством, вы можете также использовать accumarray
. Если предположить, что B
и C
состоять только из целых чисел, сделайте следующее:
>> B = [ 1 2 1 4 5 2 2 ];
>> C = [ 1 2 ];
>> D = accumarray(B.', 1);
D =
2
3
0
1
1
Это, однако, вычисляет частоту всех уникальных значений в B
, и поэтому вы просто хотите первые две записи в D
.
Еще одна альтернатива заключается в использовании histc
:
>> B = [ 1 2 1 4 5 2 2 ];
>> C = [ 1 2 ];
>> D = histc(B, C)
D =
2 3
То, что вы в основном вычисления является гистограмма B
в указанных бункеров, которые обозначаются на C
.
красиво сделано с 'bsxfun' –
@SanthanSalai - Спасибо! Также хорошая работа, отлаживающая код цикла. Я собирался исправить это, но вы уже сделали это для меня LOL. – rayryeng
Отличный ответ! Просто комментарий: 'accumarray' будет работать только для целочисленных значений (если вы не ставите перед ним« уникальный », третий вывод) –