Хранение векторов в массиве ячеек

У меня есть матрица 128x100, называемая R.

У меня есть еще одна матрица 1x100, называемая I. Значения в векторе я варьируются от 1 до 64.

например, I: [13,22,55,63..., 35]

Между элементами R и I. существует взаимно однозначное соответствие.

Я хочу знать для каждого уникального значения I, т.е. Если 1 встречается в шести положениях (столбец №12, 20, 35, 62, 87, 95) в векторе I, как объединить соответствующий (столбец № 12, 20, 35, 62, 87, 95) в R и хранить информацию в одном массиве S для всех таких значений от 1 до 64.

Я пробовал, но не умею думать о компактном и правильном коде.

for j = 1:64
 for i = 1:100
 if I(i) == j
 S{j} = R(:,i);
 end 
 end 
end
2 ответа

Решение с использованием накопителя:

S = accumarray(I(:),1:100,[64 1],@(x){R(:,x)});

Если массив I не содержит всех значений 1:64 S будут иметь пустые ячейки, которые можно удалить следующим образом:

S(cellfun(@isempty,S))=[];

* Спасибо @LuisMendo за предложение улучшить ответ.


Это делает то, что хочет:

S = arrayfun(@(n) R(:,I==n), 1:64, 'UniformOutput', false);

Или с эквивалентным циклом:

S = cell(1,64);
for n = 1:64
 S{n} = R(:,I==n);
end

licensed under cc by-sa 3.0 with attribution.