MATLAB Answers

Erez
0

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

Asked by Erez
on 30 Aug 2019
Latest activity Commented on by 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!

  0 Comments

Sign in to comment.

2 Answers

Answer by Ted Shultz
on 30 Aug 2019
Edited by Ted Shultz
on 30 Aug 2019
 Accepted Answer

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

  1 Comment

Sign in to comment.


Answer by Bruno Luong
on 30 Aug 2019
Edited by 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)

  1 Comment

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!

Sign in to comment.