Array indexing for moving IQR

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?

Antworten (2)

Jos (10584)
Jos (10584) am 12 Mär. 2018

0 Stimmen

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 Kommentar

Anna McCann
Anna McCann am 12 Mär. 2018
Okay thanks, I'll try profiling it and see if it speeds it up.

Melden Sie sich an, um zu kommentieren.

Walter Roberson
Walter Roberson am 12 Mär. 2018

0 Stimmen

R2016b and later,
iqr(A((1:k).'+(0:length(A)-k)))

Kategorien

Mehr zu Operators and Elementary Operations finden Sie in Hilfe-Center und File Exchange

Tags

Gefragt:

am 11 Mär. 2018

Beantwortet:

am 12 Mär. 2018

Community Treasure Hunt

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

Start Hunting!

Translated by