Filter löschen
Filter löschen

Array indexing for moving IQR

2 Ansichten (letzte 30 Tage)
Anna McCann
Anna McCann am 11 Mär. 2018
Beantwortet: Walter Roberson am 12 Mär. 2018
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
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
R2016b and later,
iqr(A((1:k).'+(0:length(A)-k)))

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by