我目前是matlab的新手,我试图一次循环50多个元素而不是一次一个元素。例如,我有一个1000个元素的列表,我想计算每50个元素的总和。不是通过索引来执行求和函数,而是使用循环会更快。我该怎么做呢?
即。 [1,......第50个元素,第51个元素...... 100 ...] 输出将是1:50,51:100,101:150的总和值......依此类推。
提前致谢
答案 0 :(得分:3)
我不太确定“通过索引编制和函数”是什么意思,但有各种方法可以做到这一点。一般来说,我试图避免在Matlab中使用显式循环,让MathWorks函数发挥其魔力。
results = zeros(20,1);
for i = 1:20
results(i) = sum(1 + (50 * (i - 1)):50 + 50 * (i - 1));
end
另一种选择是做arrayfun
。
sIndex = 1:50:951;
eIndex = 50:50:1000;
result = arrayfun(@(x, y) sum(x:y), sIndex, eIndex);
您也可以使用reshape和sum来一次性完成。
numbers = 1:1000;
numbers2 = reshape(numbers, 50, []);
result = sum(numbers2);
最后一种方法是我个人会说的Matlab方式。 arrayfun
基本上是循环的包装器,循环是......很好的循环。
答案 1 :(得分:1)
如果您需要总和,您还可以使用movsum
:
array = 1:1000;
win = 50; % window size
msum = movsum(array,win,'Endpoints','discard');
以同样的方式,您可以使用:
movmax
移动最大值
movmean
移动平均值
movmedian
移动中位数
movmin
移动最小值
movstd
移动标准偏差
movvar
移动差异
答案 2 :(得分:1)
使用cumsum
和diff
,您可以获得所需的结果。
C = [0 cumsum(a)];
out = diff(C(1:50:end));