计算matlab中不均匀加权的均值

时间:2013-05-13 07:31:38

标签: matlab mean

我想在Matlab中计算示踪场的平均值,但构成场的单元格大小不同。例如,我的跟踪器字段是:

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

我还有另外两个字段dxdy,用于描述构成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

因此,直观地说,dxdy告诉我,跟踪器字段T的左下角应该对{{1}的平均值的计算贡献最小虽然右上角应该有最大的贡献。

我最初尝试过T,但这显然超过了mean(mean(T))左下角的重要性等等。经过一番调查后,我认为我会彻底并手动计算均值,并包括权重,使用类似的东西:

T

T_mean_i = sum(T*dx)./sum(dx) 类似,y方向的单元格宽度。但是,我不确定如何实现这一点。

编辑:这是我的问题的更多细节。

我的网格是260 * 380个单元格,因此dy。通过将表面通量字段(例如size(dy) = size(dx) = 260-by-380)除以类似大小的盐度字段sflux来计算示踪剂字段。因此,salt,其中时间维度的长度为size(sflux) = size(salt) = 260-by-380-by-1000

我希望在每个时间步{{1}找到1000 的平均值,包括单元格宽度字段sflux(:,:)./salt(:,:,ii)dx的权重}。 (我不会用for-loop来做这个,别担心!!)

我正在做正确的事情吗?或者我想到这个错误?请随时要求澄清。

干杯!

2 个答案:

答案 0 :(得分:3)

meansum沿着一个维度运作。要将它们应用于整个矩阵,请先使用colon operator:)将数据转换为列向量,例如:

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

答案 1 :(得分:1)

你可以通过

来完成
sum(T(:).*dx(:).*dy(:))./( sum(dx(:).*dy(:) )

请注意,您应该在此处使用元素 -wise产品.*,而不是矩阵产品*