【问题标题】:How should I perform this binning and averaging in MATLAB?我应该如何在 MATLAB 中执行这种分箱和平均?
【发布时间】:2010-12-19 17:06:39
【问题描述】:

我正在尝试执行分箱平均。我正在使用代码:

Avg = mean(reshape(a,300,144,27));
AvgF = squeeze(Avg);

最后一行去掉了单一维度。

所以可以看出我的平均得分超过 300 分。它工作正常,除非我的总点数不等于 144*300 的倍数。

即使总点数不是 144*300 的倍数,是否有任何方法可以使这种分箱平均工作?

编辑:对不起,如果我的问题听起来令人困惑。澄清一下……

我有一个包含 43200 行和 27 列的文件。我通过一次分箱 300 行来平均,这意味着最后我留下了一个大小为 144×27 的矩阵。

我上面写的代码只有在我正好有 43200 行时才有效。在某些情况下,我有 43199、43194 等。当我的总行数是 300(bin 大小)的倍数时,reshape 函数起作用。当我的总行数不是 300 的倍数时,有没有办法使这种分箱平均工作?

【问题讨论】:

  • 在不知道数据是什么样子的情况下,一个想法是用NaN 填充数组以达到所需的大小并使用nanmeanmean 相同,只是忽略NaN 值.
  • 你总共少了多少分?一个或两个?数百?几千?
  • 在某些文件中我有 86399,其他 86395 等等,而我一整天都需要 86400。就像我写的那样,如果我擦除更多点使其等于 143*300 ,它就可以工作,但我必须手动检查并擦除 pts 。所以我想知道是否有办法完成它
  • 如果你的总点数是86,400,你代码中的“27”不应该是“2”吗?
  • 不应该是 27,因为我在文件中有 27 列

标签: matlab mean binning


【解决方案1】:

我想我现在更好地理解了这个问题......

如果 a 是从您的文件中读取的数据(大小为 N×27,其中 N 理想情况下为 43,200),那么我认为您需要执行以下操作:

nRemove = rem(size(a,1),300);  %# Find the number of points to remove
a = a(1:end-nRemove,:);        %# Trim points to make an even multiple of 300
Avg = mean(reshape(a,300,[],27));
AvgF = squeeze(Avg);

这将删除点,使得a 中的行数将是 300 的倍数。然后你的重塑和平均应该工作。请注意,我在对RESHAPE 的调用中使用了[],它可以确定列数应该是多少。

【讨论】:

  • @AP:我想肯定有人对你投了反对票,因为第一个版本有点不清楚。最新版本更有意义,所以也许他们会来删除他们的反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多