1

Matlab でトレーサー フィールドの平均を計算したいのですが、フィールドを構成するセルのサイズが異なります。たとえば、私のトレーサー フィールドは次のとおりです。

T = 
 1 3 5 8
 2 1 4 3
 2 1 9 1
 20 8 3 1

さらに 2 つのフィールドがdxありdy、 を構成するセルのサイズを記述しTます。

dx =
 1 1 2 3
 1 1 2 3
 1 1 2 3
 1 1 2 3

dy = 
 3 3 3 3
 3 3 3 3
 2 2 2 2
 1 1 1 1

したがって、直感的に、トレーサ フィールドの左下隅はの平均の計算に対して最小の寄与を持ち、右上隅は最大の寄与を持つはずであるdxと教えてください。dyTT

私は最初に を試しmean(mean(T))ましたが、これは明らかに などの左下隅の重要性を過大評価していTます。少し調査した後、次のようなものを使用して、重み付けを含め、徹底的に手動で平均を計算することにしました。

T_mean_i = sum(T*dx)./sum(dx)

と同様にdy、y 方向のセル幅です。ただし、これを実装する方法がわかりません。

編集:これが私の質問の詳細です。

私のグリッドは 260*380 セルなので、size(dy) = size(dx) = 260-by-380. トレーサーフィールドは、表面フラックスフィールドをsflux、同様のサイズの塩分フィールドで割ることによって計算されsaltます。したがって、size(sflux) = size(salt) = 260-by-380-by-1000時間次元の長さは1000です。

セル幅フィールドの重み付けをsflux(:,:)./salt(:,:,ii) 含む平均を見つけたいdxdy、各タイムステップでii。(これを行うために for ループは使用しませんが、心配しないでください!!)

私は自分がしていることで正しい軌道に乗っていますか? それとも私はこれについて間違っていると思いますか?ご不明な点はお気軽にお尋ねください。

乾杯!

4

2 に答える 2

3

meansum単一の次元に沿って動作します。これらを行列全体に適用するには、最初にコロン演算子( :)を使用してデータを列ベクトルに変換します。次に例を示します。

w = dx .* dy;
sum(w(:))

3 次元配列の各レイヤーの目的の平均を取得するには、次のようにします。

T = sflux ./ salt; %// Tracer field
w = dx .* dy;      %// Weights
T_mean = sum(reshape(bsxfun(@times, T, w), [], size(T, 3))) / sum(w(:));

T_meanこれにより、各タイム ステップでの平均値に対応する要素を含む配列が生成されます。

説明:bsxfun(@times, T, w)要素ごとに各レイヤーに重みを掛けます。結果の重み付けされた 3 次元配列は 2 次元配列に再形成されるため、各列は別の列に変換され (コロン演算子と同様)、重みの合計によってすべてが正規化されます。

于 2013-05-13T07:39:52.157 に答える
1

あなたはそれを行うことができます

sum(T(:).*dx(:).*dy(:))./( sum(dx(:).*dy(:) )

ここでは、行列の積ではなく、要素ごとの積を使用する必要があることに注意してください。.**

于 2013-05-13T07:39:31.047 に答える