[英]Optimize computation of anomaly from mean along one axis for large arrays
[英]Split, group and mean: computation with arrays
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`
我解決了!!!
免責聲明:這回答了問題的先前版本。
在這種情況下,我建議使用具有可預測行為的內置插件。 在您的情況下,這將是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)
順便說一句,從A
的切片創建B
的步驟可以使用
B = num2cell(A,[2,3]); % yields a 16x1 cell array of 1x3x3 double arrays
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.