问题在于:
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:我们需要覆盖原始数据数组(基本上是对数据进行分区并对其进行平均)
答案 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)
请注意,从技术上讲,如果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矩阵,然后使用均值函数计算每列的平均值。