Разбиение, группировка и среднее значение: вычисления с массивами - PullRequest
0 голосов
/ 02 ноября 2019

A - это заданный массив N x R xT. Я должен разделить его по горизонтали до N подмассивов размером L x M, а затем сгруппировать каждый z в массив K и взять среднее значение.

Например: A - массив rand (N, R, T) = rand (16, 3, 3);Теперь я собираюсь разделить его:

A=rand( 16, 3 ,3)   :   A(1,:,:), A(2,:,:), A(3,:,:), A(4,:,:), ... , A(16,:,:).

У меня есть 16 срезов.

B_1=A(1,:,:);  B_2=A(2,:,:);   B_3=A(3,:,:);  ... ; B_16=A(16,:,:);  

Следующим шагом является группировка каждые 3 (например).

Теперь я собираюсь создать K_i как:

K_1(1,:,:)=B_1;
K_1(2,:,:)=B_2;
K_1(3,:,:)=B_3;

...
K_8(1,:,:)=B_14;
K_8(2,:,:)=B_15;
K_8(3,:,:)=B_16;

Средний массив найден как:

C_1=[B_1 + B_2 +  B_3]/3
...

C_8= [ B_14 + B_15 + B_16] /3

Я реализовал его как:

A_reshape = reshape(squeeze(A), size(A,2), size(A,3),2, []);
mean_of_all_slices = permute(mean(A_reshape , 3), [1 2 4 3]);

Question 1 Я проверил вручную. Это дает мне неверный результат. Как это исправить? [решено]

РЕДАКТИРОВАТЬ 2 Мне нужно смоделировать следующие вычисления:

взять произведение на каждый кусочек массива K_iс другим массивом P_p: это означает:

for `K_1` is given `P_1`): `B_1 * P_1` , `B_2 * P_1`, `B_3 * P_1`

...
for `K_8` is given `P_8`): `B_14 * P_8` , `B_15 * P_8`, `B_16 * P_8`

Я решил !!!

1 Ответ

0 голосов
/ 03 ноября 2019

Отказ от ответственности : это ответ на предыдущую версию вопроса.

В таких случаях я бы предложил опираться на встроенные модули, которые имеют предсказуемый характер. поведение. В вашем случае это будет movmean (введено в R2016a):

WIN_SZ = 2;  % Window size for averaging
AVG_DIM = 1; % Dimension for averaging
tmp = movmean(A, WIN_SZ , AVG_DIM ,'Endpoints', 'discard');
C = tmp(1:WINDOW_SZ:end, :, :); % This only selects A1+A2, A3+A4 etc.

Если ваш MATLAB немного старше, это также можно сделать с помощью свертки (convn, представленный до R2006):

WIN_SZ = 3;
tmp = convn(A, ones(WIN_SZ ,1)./WIN_SZ, 'valid'); % Shorter than A in dim1 by (WIN_SZ-1)
C = tmp(1:WINDOW_SZ:end, :, :); % dim1 size is: ceil((size(A,1)-(WIN_SZ-1))/3)

Кстати, шаг, на котором вы создаете B из кусочков A, может быть выполнен с использованием

B = num2cell(A,[2,3]); % yields a 16x1 cell array of 1x3x3 double arrays
...