#arrays #matlab #matrix
#массивы #matlab #матрица
Вопрос:
Как мы можем суммировать элементы по частям в матрице? Рассмотрим первичную матрицу таким образом, чтобы ее можно было разделить на меньшую матрицу m на n. затем я хочу суммировать целые элементы каждой матрицы m by n вместе и поместить число вместо матрицы m by n
например, рассмотрим следующую матрицу, я хочу суммировать каждые четыре элемента и создать другую матрицу:
A = [1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16];
И после суммирования я хочу иметь:
B = [14 22
46 54];
В этом примере я суммировал 4 элемента как матрицу 2 на 2, тогда, например, результат суммирования 1,2,5 и 6 мест в первом элементе новой матрицы.
Комментарии:
1. Рассмотрим первичную матрицу таким образом, чтобы ее можно было разделить на меньшую матрицу m на n. затем я хочу суммировать целые элементы каждой матрицы m by n вместе и поместить число вместо матрицы m by n.
Ответ №1:
Пусть
m = 2; %// number of rows per block
n = 2; %// number of columns per block
Вы можете выполнить суммирование с помощью blockproc
(из набора инструментов обработки изображений), который очень подходит для этой задачи:
B = blockproc(A, [m n], @(x) sum(x.data(:)));
Или, если вы создаете соответствующие индексы, вы можете использовать accumarray
:
[ii jj] = ndgrid(1:size(A,1), 1:size(A,2));
B = accumarray([ceil(ii(:)/n) ceil(jj(:)/m)], A(:))
Ответ №2:
Один подход —
B = squeeze(sum(reshape(sum(reshape(A,m,[])),size(A,1)/m,n,[]),2))
Другой подход, если вы хотите избежать squeeze
, который иногда медленнее —
B = reshape(sum(reshape(reshape(sum(reshape(A,m,[])),size(A,1)/m,[])',n,[])),[],size(A,1)/m)'