Find max values of n previous values in a matrix without a loop.

1 view (last 30 days)
Hello,
I have a single column matrix and need to add a second column containing on each row the highest value of n previous row.
For example, my matrix would have this column:
Column1
1
4
3
6
3
5
4
7
2
5
6
1
I am looking to add a column containing the high value of 3 previous rows (including the current row) in the first column, so that I would obtain:
Column1 Column2
1 NaN
4 NaN
3 4
6 6
3 6
5 6
4 5
7 7
2 7
5 7
6 6
1 6
Is it possible in Matlab without a for to loop?
Many thanks,
Libor

Accepted Answer

José-Luis
José-Luis on 3 Jan 2017
a = randi(10,10,1);
your_result = max([a, circshift(a,1), circshift(a,2)],[],2);
your_result(1:2) = NaN;
  8 Comments
José-Luis
José-Luis on 3 Jan 2017
Edited: José-Luis on 3 Jan 2017
My pleasure. I had no idea something like movmax() existed, and it is indeed a better answer.
It was fun coming up with this anyway.

Sign in to comment.

More Answers (2)

Stephen23
Stephen23 on 3 Jan 2017
Edited: Stephen23 on 4 Jan 2017
The simplest solution is to download Jos's excellent FEX submission slidefun, which works for all MATLAB versions (movmax was introduced in R2016a):
V = [1;4;3;6;3;5;4;7;2;5;6;1];
N = 3; % window size
W = slidefun(@max,N,V,'backward');
W(1:N-1) = NaN;
And checking the answer:
>> [V,W]
ans =
1 NaN
4 NaN
3 4
6 6
3 6
5 6
4 5
7 7
2 7
5 7
6 6
1 6
  1 Comment
Libor Cerny
Libor Cerny on 3 Jan 2017
Thank you very much Stephen, this also does exactly what I need, although as per Torsten's comment above, there are apparently built-in and optimized functions in Matlab now. Thanks again!

Sign in to comment.


Guillaume
Guillaume on 3 Jan 2017
Edited: Guillaume on 3 Jan 2017
Actually, the simplest solution is to use movmax (since R2016a):
v = [1 4 3 6 3 5 4 7 2 5 6 1].';
n = 3;
[v, [nan(n-1, 1); movmax(v, n, 'EndPoints', 'discard')]]
edit: which I see was already suggested by Torsten in the hidden comments
  1 Comment
Libor Cerny
Libor Cerny on 3 Jan 2017
Yes. :)
But thank you anyhow, Guillaume! I really appreciate all help. Et... Bonne annee! ;)

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!