1

別のベクトルで集約したい 3 次元 (またはそれ以上) の配列があります。特定のアプリケーションは、空間データを毎日観察し、それらを平均して月ごとの値を取得することです。したがって、次元を持つ配列があり、次元を持つ<Lat, Lon, Day>配列を作成したいと考えています<Lat, Lon, Month>

ここに私が欲しいもののモック例があります。現在、ループを使用して正しい出力を取得できますが、実際にはデータが非常に大きいため、2 番目のループよりも効率的なソリューションを期待していました。

% Make the mock data
A = [1 2 3; 4 5 6];
X = zeros(2, 3, 9);
for j = 1:9
  X(:, :, j) = A;
  A = A + 1;
end

% Aggregate the X values in groups of 3 -- This is the part I would like help on
T = [1 1 1 2 2 2 3 3 3];
X_agg = zeros(2, 3, 3);
for i = 1:3
  X_agg(:,:,i) = mean(X(:,:,T==i),3);
end

2 次元では を使用しますaccumarrayが、それはより高い次元の入力を受け入れません。

4

1 に答える 1

0

答えにたどり着く前に、まずコードをより一般的な方法で書き直しましょう。

ag = 3; % or agg_size

X_agg = zeros(size(X)./[1 1 ag]);

for i = 1:ag
  X_agg(:,:,i) = mean(X(:,:,(i-1)*ag+1:i*ag), 3);
end

ループの使用を避けるためのfor1 つのアイデアは、X 行列を関数を直接reshape使用できるものにすることです。mean

splited_X = reshape(X(:), [size(X_agg), ag]);

したがってsplited_X(:,:,:,i)、集約する必要があるすべての行列を含む i 番目の部分はX(:,:,(i-1)*ag+1:i*ag))(上記のように)

次に、 の 3 次元の平均を見つける必要がありますsplited_X

temp = mean(splited_X, 3);

ただし、これは 4D 行列になります (3 次元のサイズは 1 です)。reshape関数を使用して、再び 3D マトリックスに変換できます。

X_agg = reshape(temp, size(X_agg))

どれだけ効率的かは試していませんが、forループを使用しないため、大きな行列の場合はうまくいくはずです。

于 2013-05-22T04:03:18.643 に答える