суммирование по матрице в разных частях этой матрицы в matlab

#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)'