Array indexing for moving IQR

2 次查看(过去 30 天)
Anna McCann
Anna McCann 2018-3-11
I'm calculating a moving iqr, similar to the movmean, movmad, and movstd functions, discarding the endpoints:
A = [4 8 6 -1 -2 -3 -1 3 4 5];
for i = 1:length(A)-k+1
M(i) = iqr(A(i:i+k-1)
end
M = [3.0000 6.7500 6.0000 1.5000 1.5000 4.5000 3.7500 1.5000]
M is as expected. How can I do this more efficiently using array indexing?

回答(2 个)

Jos (10584)
Jos (10584) 2018-3-12
When N (= number of elements in A) and K (= number of elements to use) are not too large you could create an intermediate (N-K+1)-by-K array. This could be (slightly) more efficient than a for-loop but also looks more cryptic ...
A = [4 8 6 -1 -2 -3 -1 3 4 5]
K = 3
N = numel(A)-K+1
I = cumsum([1:N ; ones(K-1,N)], 1)
M = iqr(A(I), 1)
  1 个评论
Anna McCann
Anna McCann 2018-3-12
Okay thanks, I'll try profiling it and see if it speeds it up.

请先登录,再进行评论。


Walter Roberson
Walter Roberson 2018-3-12
R2016b and later,
iqr(A((1:k).'+(0:length(A)-k)))

类别

Help CenterFile Exchange 中查找有关 Matrices and Arrays 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by