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

2 次查看(过去 30 天)
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

采纳的回答

José-Luis
José-Luis 2017-1-3
a = randi(10,10,1);
your_result = max([a, circshift(a,1), circshift(a,2)],[],2);
your_result(1:2) = NaN;
  8 个评论
José-Luis
José-Luis 2017-1-3
编辑:José-Luis 2017-1-3
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.

请先登录,再进行评论。

更多回答(2 个)

Stephen23
Stephen23 2017-1-3
编辑:Stephen23 2017-1-4
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 个评论
Libor Cerny
Libor Cerny 2017-1-3
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!

请先登录,再进行评论。


Guillaume
Guillaume 2017-1-3
编辑:Guillaume 2017-1-3
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

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by