2017-01-04 13 views
2

私は9 x 682の行列(A)を持っています。 36列ごとに新しい変数(合計17変数)が対応します。各変数(36列)について、6列ごとの平均を計算したい(36列の各ブロックについて、列1,7,13,19,31などの平均を計算する)複数のループを使って行列を計算する方法は?

ループのために、いくつかの使用。

A_averaged = zeros(9,102); 

for i = 1:36:length(A) 
    for j = i:i+35 
     for k = j:6:j+1 
      A_averaged(:,k) = mean(A(:,k), 2); 
     end 
    end 
end 

すべてのヘルプははるかに高く評価される。

答えて

4

これをベクトル化するには、私は、スマートな方法でデータを再構築したい列を選択し、平均値を計算します。

% Reshape data to 3D with dimensions: 9 x 36 x (nGroups) 
B = reshape(A, size(A, 1), 36, []); 

% Now grab the columns of each chunk you want 
C = B(:, 1:6:end, :); 

% Now compute the mean along the first dimension and squeeze the result 
result = squeeze(mean(C, 1)); 

次と1行で行うことができます。

result = squeeze(mean(reshape(A(:, 1:6:end), size(A, 1), 6, []), 1)) 

あなたの代わりにすべての行と列の平均値をしたい場合は、あなたが45 x nGroupsにデータを再構築し、最初の次元

result = mean(reshape(C, [], size(C, 3)), 1); 
に沿って平均値を計算することができます

補足として、最初の寸法は9 x 682で、実際には36列で割り切れるわけではありません。 9 x 612を意味しましたか?

+0

そこには 'accumarray'があります... –

+0

確かに、サイズ(A)= 9 x 612を意味します。 有益な答えをありがとう。 – AJMA

関連する問題