Для общего случая, когда у вас есть N
разных строк и каждая из этих строк встречается разное число раз M_i
, тогда каждый соответствующий набор значений в B
будет иметь различную длину, и вы не будете быть в состоянии объединить наборы вместе в числовой массив. Вместо этого вам придется хранить наборы в N
-элементе массиве ячеек , и вы можете сделать это, используя функции UNIQUE и ACCUMARRAY :
>> A = {'a' 'b' 'b' 'c' 'a' 'a' 'a' 'c' 'd' 'b'}; %# Sample array A
>> B = 1:10; %# Sample array B
>> [uniqueStrings,~,index] = unique(A)
>> associatedValues = accumarray(index(:),B,[],@(x) {x})
associatedValues =
[4x1 double] %# The values 1, 5, 6, and 7
[3x1 double] %# The values 2, 3, and 10
[2x1 double] %# The values 4 and 8
[ 9] %# The value 9
В конкретном случае, когда каждая строка встречается одинаковое количество раз, приведенный выше код будет работать нормально, и у вас будет возможность преобразовать вывод массива ячеек в требуемый числовой массив, например, так:
associatedValues = [associatedValues{:}];
ПРИМЕЧАНИЕ: Поскольку ACCUMARRAY не гарантирует сохранение относительного порядка элементов, которые он накапливает, порядок элементов в ячейках associatedValues
может не соответствовать относительному порядку, который они имели в вектор B
. Один из способов обеспечить сохранение исходного относительного порядка в B
- изменить вызов на ACCUMARRAY следующим образом:
associatedValues = accumarray(index(:),1:numel(B),[],@(x) {B(sort(x))});
Или вы можете отсортировать входные данные по ACCUMARRAY , чтобы получить тот же эффект:
[index,sortIndex] = sort(index);
associatedValues = accumarray(index(:),B(sortIndex),[],@(x) {x});