Я думаю, что очень общее (и векторизованное) решение выглядит примерно так:
v1 = [ 1 2 3 4 5 6 7 8 9 ]
c2 = { 'a' 'a' 'a' 'b' 'b' 'c' 'c' 'c' 'c' }
uniqueValuesInC2 = unique(c2);
conditionalSumOfV1 = @(x)(sum(v1(strcmp(c2, x))));
result = cellfun(conditionalSumOfV1, uniqueValuesInC2)
Возможно, мое решение нуждается в небольшом объяснении неподготовленным глазом:
Итак, сначала вам нужно вычислить различные возможные значения в c2
, что делается с помощью unique
.
Функция conditionalSumOfV1
принимает аргумент x
, она сравнивает каждый элемент в c2
с x
и выбирает соответствующие элементы в v1
и суммирует их.
Наконец, cellfun
сопоставим с конструкцией foreach
в некоторых других языках: функция conditionalSum
вычисляется для каждого значения в массиве ячеек, который вы предоставляете (в данном случае: каждое уникальное значение в c2
) сохраняет его в выходном массиве. Для других типов контейнерных переменных (массивов, структур) MATLAB имеет эквивалентные foreach
-подобные конструкции: arrayfun
, structfun
.
Это будет работать для содержимого c2
, которое длиннее одного символа, и не требует большой операции repmat
в качестве решения Stardt. У меня, однако, есть сомнения, когда дело доходит до длинных массивов, где c2
имеет только несколько повторяющихся значений, но я думаю, что это будет сложный случай для большинства алгоритмов. Если вы находитесь в таком случае, вам может понадобиться взглянуть на дополнительные выходные данные unique
или написать свою собственную альтернативу unique
(то есть написать for
циклы, предпочтительно на скомпилированном языке / MEX).