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告诉dy我,跟踪字段的左下角T应该对计算 的平均值的贡献最小T,而右上角的贡献应该最大。

我最初尝试过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) 包括单元格宽度字段的权重的平均值,dx并且dy,在每个时间步ii。(我不会使用 for 循环来做到这一点,别担心!!)

我正在做的事情是否正确?还是我想错了?请随时要求澄清。

干杯!

4

2 回答 2

3

meansum沿单一维度进行操作。要将它们应用于整个矩阵,请先使用冒号运算符( :) 将数据转换为列向量,例如:

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

要获得 3-D 数组中每一层的所需平均值,您可以执行以下操作:

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-D 数组重新整形为 2-D 数组,以便将每一列转换为不同的列(类似于冒号运算符),然后通过权重之和对所有内容进行归一化。

于 2013-05-13T07:39:52.157 回答
1

你可以这样做

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

请注意,您应该在此处使用按元素乘积.*而不是矩阵乘积*

于 2013-05-13T07:39:31.047 回答