我想在Matlab中计算示踪场的平均值,但构成场的单元格大小不同。例如,我的跟踪器字段是:
T =
1 3 5 8
2 1 4 3
2 1 9 1
20 8 3 1
我还有另外两个字段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
的左下角应该对{{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来做这个,别担心!!)
我正在做正确的事情吗?或者我想到这个错误?请随时要求澄清。
干杯!
答案 0 :(得分:3)
mean
和sum
沿着一个维度运作。要将它们应用于整个矩阵,请先使用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产品.*
,而不是矩阵产品*
。