A
是一个给定的N x R xT
数组。我必须将其水平拆分为大小为L x M
的N
子阵列,然后将每个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
我已经亲自检查过了。这给了我一个错误的结果。如何修复[已解决]
EDIT 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`
我解决了!!!
免责声明:这回答了以前版本的问题。
在这种情况下,我建议依赖具有可预测行为的内置程序。在您的情况下,这将是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)
BTW,从A
的切片创建B
的步骤可以使用完成
B = num2cell(A,[2,3]); % yields a 16x1 cell array of 1x3x3 double arrays