【问题标题】:(non-overlapping moving) Average of every n element in a vector [duplicate](非重叠移动)向量中每个 n 元素的平均值 [重复]
【发布时间】:2017-01-30 23:21:28
【问题描述】:

我有一个数组(大小为 2958 x 1)。我想从开始平均每五个单独的元素并将结果存储到一个新数组中。例如:

arr = (1:10).'; % for this array
avg = [3; 8]; % this should be the result

我该怎么做?

【问题讨论】:

  • 你的意思是运行平均值吗?即第一个结果是数据的平均值(1:5),第二个是数据的平均值(2:6),或者是第二个结果的平均值数据(6:10)?
  • 我应该在我的上一条评论中说,如果是第一种情况,请查看uk.mathworks.com/help/matlab/ref/filter.html,这是第一个工作示例。如果是第二个,那么我会建议像 mean(reshape(data,[],5),2); 这样的东西,但数据的长度必须是 5 的倍数才能起作用。
  • @Dave Yes..第一个结果是 (1:5) 的平均值,第二个结果是 (6:10)。是的,数据的长度应该是 5 的倍数,但它的长度不是 5 的倍数,那么剩余的点(例如,在这种情况下,2985 中剩余 3 个点)可以按原样附加到结果数组中。
  • tsmovavg(金融工具箱)

标签: matlab vector moving-average


【解决方案1】:

计算数组中每个n 元素平均值的一种方法是使用arrayfun

n = 5;
arr = rand(2958,1); % your array
avg = arrayfun(@(ii) mean(arr(ii:ii + n - 1)), 1:n:length(arr) - n + 1)';

更新:

这工作得更快:

avg = mean(reshape(arr(1:n * floor(numel(arr) / n)), [], n), 2);

差别很大:

------------------- With ARRAYFUN
Elapsed time is 4.474244 seconds.
------------------- With RESHAPE
Elapsed time is 0.013584 seconds.

arrayfun 在这里这么慢的原因是我没有正确使用它。 arr(ii:ii + n - 1) 在内存中创建一个数组,它发生了很多次。另一方面,reshape 方法可以无缝运行。

【讨论】:

  • 你能告诉我这个命令的含义,它是如何工作的
  • numelfloorreshapemean。您可以从最内部的部分numel(arr) 开始,然后逐步对其应用其他功能,以查看每个步骤中的输入发生了什么。
  • 谢谢。经过一些修改,它工作了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2018-06-14
  • 1970-01-01
  • 2018-01-09
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多