【问题标题】:Calculate mean for uneven weighting in matlab在matlab中计算不均匀加权的平均值
【发布时间】:2013-05-13 07:31:37
【问题描述】:

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

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

我还有 2 个字段,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 的左下角对计算 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) 包括单元格宽度字段的权重,dxdy,在每个时间步 ii。 (我不会使用 for 循环来做到这一点,别担心!!)

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

干杯!

【问题讨论】:

  • 每个元素的重量:是dxdy在各自位置的product,还是sum
  • 嗯,dy.*dy 是每个单元格的面积。因此,据我所知,每个单元格的面积决定了应该为平均值赋予的权重。我唯一担心的是结果是否正确标准化...
  • 感谢您的超级快速回答...我避免使用(:),因为该字段实际上是 3-d(第三个暗淡。代表时间)。所以,我想在每个时间步计算均值。使用(:) 将意味着所有时间。

标签: matlab mean


【解决方案1】:

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

【讨论】:

  • 感谢@EitanT 的帮助!我对这种技术有疑问。 SomeMatrix = bsxfun(@times,T,w) 被重新整形为二维矩阵,在这种情况下,大小为260*380-by-1000。我如何确定每一行的元素(即 260*380 中的元素)来自SomeMatrix(:,:,1)?换句话说,当SomeMatrix 被重构时,我怎么知道在重构矩阵中早先引入了来自较晚时间步的no 元素?
  • @David_G reshape (与许多 MATLAB 内置函数一样)首先沿列操作,然后是行,然后是第 3 维,依此类推......所以如果原始矩阵的每一层都等于新矩阵中每一列的长度,这样可以保证一层中的元素不会出现在另一列中。自己试试看:A = reshape(1:12, [2 2 3]); B = reshape(A, [], 3);
  • 哇。有 2 个帐户... (1) 感谢您的演示 - 我从来没有真正相信 reshape 正在做我想做的事...在此之前! (2) 我刚刚实施了您的建议 (bsxfun),之前在 96GB RAM 的设施上花费 7-8 小时完成的工作,现在几乎在 10-15 分钟内完成。脑洞大开!!
【解决方案2】:

你可以这样做

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

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

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2016-12-14
    • 2021-11-21
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2021-10-20
    相关资源
    最近更新 更多