# Find series of maxima of array (and matrix) within blocks of size n

3 views (last 30 days)
Erez on 30 Aug 2019
Commented: Erez on 30 Aug 2019
I have a simple problem, and it's, perhaps, less simple extension:
1. I have an array A=[1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5] (all positive). How do I produce a vector B, which contains the maxima of, say, blocks of n=5 within A?
Namely, I want to produce B=[5 5 5 5].
2. I have a matrix: A=[1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5; 1 2 5 1 0 0 7 0 1 2 4 0 7 3 2 0 1 0 0 5; 1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5;] . Now, I want to get the matrix: C=[5 5 5 5; 5 7 7 5; 5 5 5 5] .
Can these two tasks be achomplished with a single procedure, without using loops?
Thanks!

Ted Shultz on 30 Aug 2019
Edited: Ted Shultz on 30 Aug 2019
You could use rehsape and max:
[reshape(max(reshape(A',5,[])), [], size(A,1))]'
Test:
A=[1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5]
[reshape(max(reshape(A',5,[])), [], size(A,1))]'
A=[1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5; 1 2 5 1 0 0 7 0 1 2 4 0 7 3 2 0 1 0 0 5; 1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5;]
[reshape(max(reshape(A',5,[])), [], size(A,1))]'
ans =
5 5 5 5
ans =
5 5 5 5
5 7 7 5
5 5 5 5
Erez on 30 Aug 2019
Thanks a lot!

Bruno Luong on 30 Aug 2019
Edited: Bruno Luong on 30 Aug 2019
maxfun = @(A) squeeze(max(reshape(A,size(A,1),5,[]),[],2));
A = [1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5]
B = maxfun(A)
A = [1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5; 1 2 5 1 0 0 7 0 1 2 4 0 7 3 2 0 1 0 0 5; 1 2 5 1 0 0 5 0 1 2 4 0 5 3 2 0 1 0 0 5]
C = maxfun(A)
Erez on 30 Aug 2019
Awsome solution! I can't formally accept two solutions on this website, so I'll "accept" the first (arbitrarily). But this solution of yours works just as great. Thanks!