如何尽可能快地平均阵列的独立连续块?

时间:2017-09-19 15:46:22

标签: arrays matlab performance optimization average

问题在于:

data = 1:0.5:(8E6+0.5);

需要每10,000个元素平均一个1600万点的数组。

像这样:

x = mean(data(1:10000))

但重复了N次,其中N取决于我们平均的元素数量

range = 10000;

N = ceil(numel(data)/range);

我目前的方法是:

data(1) = mean(data(1,1:range));
for i = 2:N
    data(i) = mean(data(1,range*(i-1):range*i));
end

如何提高速度?

N.B:我们需要覆盖原始数据数组(基本上是对数据进行分区并对其进行平均)

3 个答案:

答案 0 :(得分:4)

data = 1:0.5:(8E6-0.5); % Your data, actually 16M-2 elements
N = 1e4; % Amount to average over
tmp = mod(numel(data),N); % find out whether it fits
data = [data nan(1,N-tmp)]; % add NaN if necessary
data2=reshape(data,N,[]); % reshape into a matrix
out = nanmean(data2,1); % get average over the rows, ignoring NaN

使用plot(out)

视觉确认它有效

enter image description here

请注意,从技术上讲,如果mod(numel(data),N)不等于0,则无法执行您想要的操作,因为那样您就会有余数。我选择对那里的所有东西进行平均,尽管忽略其余部分也是一种选择。

如果您确定mod(numel(data),N)每次都为零,则可以将所有内容保留为零并直接重新整形。我不建议使用此功能,因为如果mod不为0,则reshape会出错:

data = 1:0.5:(8E6+0.5); % 16M elements now
N = 1e4; % Amount to average over
out = sum(reshape(data,N,[]),1)./N; % alternative

答案 1 :(得分:2)

这有点浪费,但您可以使用y = movmean(x, [0 9999]); y = y(1:10000:end); (它将按照您希望的方式处理端点),然后对输出进行二次采样:

nanmean

尽管这很浪费(你计算了很多你不需要的元素),但它似乎胜过x = 1:0.5:(8E6-0.5); K = 1e4; Npad = ceil(length(x)/K)*K - length(x); x((end+1):(end+Npad)) = 0; y = mean(reshape(x, K, [])); y(end) = y(end) * K/(K - Npad); 方法(至少在我的机器上)。

=====================

还可以选择补充您添加的额外元素:

{{1}}

答案 2 :(得分:0)

将数据阵列重塑为10000XN矩阵,然后使用均值函数计算每列的平均值。