Вот решение на основе accumarray
.Он не использует циклы и работает для общих размеров N
(количество матриц), R
(количество строк каждой матрицы) и C
(количество столбцов каждой матрицы):
Создание примеров данных (используя обобщение кода в вопросе):
N = 3; % number of matrices
R = 2; % number of rows of each matrix
C = 3; % number of columns of each matrix
mycell = cell(N,1);
for i =1:N;
mycell{i} = randi([0, 10], [R C]);
end
Используются следующие шаги:
- Построение индексов строк и столбцов с соответствующим разбросом;
- Объединить массив ячеек и линеаризовать, чтобы все данные были в векторе-столбце;
- Применить
accumarray
для построения матрицы результатов, суммируя значения с одинаковыми индексами.
Код:
indCol = repmat((0:N-1)*(R-1)+(1:R).', C, 1);
indRow = repelem((0:N-1)*(C-1)+(1:C).', R, 1);
newmatrix = accumarray([indCol(:) indRow(:)], reshape(cat(3, mycell{:}), 1, []));
Пример результата:
>> celldisp(mycell)
mycell{1} =
3 1 2
5 6 7
mycell{2} =
7 4 2
8 0 10
mycell{3} =
1 5 0
9 10 4
>> newmatrix
newmatrix =
3 1 2 0 0 0 0
5 6 14 4 2 0 0
0 0 8 0 11 5 0
0 0 0 0 9 10 4