For Loop Indexing of matrices

1 view (last 30 days)
Aidan Turner
Aidan Turner on 9 Mar 2021
Commented: Matt J on 10 Mar 2021
I have a matrix of dimensions 36x25x355.
I would like to extract 36x25 arrays from this data and index them 1,2,3 and so on, as descrtibed in attached picture. I would like to be able to do this for any size matrix multipe times so I need to create a for loop.
As 355 does not divide wholly into 25, I would like the last array to be smaller than the others.
Any help with this woud be greatly appreciated.
  2 Comments
Jan
Jan on 9 Mar 2021
I assume "36x25x355" is a typo. You mean 36x355, don't you?
Aidan Turner
Aidan Turner on 9 Mar 2021
Apologies. Yes it's a 3 dimenstional NIfTI file, so in 2 dimensions 36x355

Sign in to comment.

Answers (2)

Matt J
Matt J on 9 Mar 2021
Edited: Matt J on 9 Mar 2021
  9 Comments
Steven Lord
Steven Lord on 10 Mar 2021
From this additional information about what you're trying to do, splitting this matrix into cells in a cell array doesn't seem like the best option anymore. Pad your array with columns of missing data at the end until its width is a multiple of the width of the "blocks" you want to create, then reshape the data into a 3-dimensional array.
n = 7;
A = magic(n)
A = 7×7
30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20
paddedA = [A, NaN(n, 1)]
paddedA = 7×8
30 39 48 1 10 19 28 NaN 38 47 7 9 18 27 29 NaN 46 6 8 17 26 35 37 NaN 5 14 16 25 34 36 45 NaN 13 15 24 33 42 44 4 NaN 21 23 32 41 43 3 12 NaN 22 31 40 49 2 11 20 NaN
B = reshape(paddedA, [n 4 2])
B =
B(:,:,1) = 30 39 48 1 38 47 7 9 46 6 8 17 5 14 16 25 13 15 24 33 21 23 32 41 22 31 40 49 B(:,:,2) = 10 19 28 NaN 18 27 29 NaN 26 35 37 NaN 34 36 45 NaN 42 44 4 NaN 43 3 12 NaN 2 11 20 NaN
Now you can use the dim input argument to functions like sum and max to compute the sum or maximum in a specific dimension.
C = max(B, [], 3)
C = 7×4
30 39 48 1 38 47 29 9 46 35 37 17 34 36 45 25 42 44 24 33 43 23 32 41 22 31 40 49
Matt J
Matt J on 10 Mar 2021
Would there be a way to calculate the max value for each point in the 36x25? For example, I would want the maximum value of the first point out of alll the reshaped matrices.
Yes, max, min, mean, median... Whatever you like:
max( reshape( yourMatrix(:,1:350), 36,25,[]) ,[],3 )

Sign in to comment.


Jan
Jan on 9 Mar 2021
X = rand(36, 355);
w = 25; % Width of the tiles
sX = size(X);
M = [repmat(w, 1, floor(sX(2) / w)), rem(sX(2), w)];
M = M(M ~= 0); % Crop last tile, if it is 0
C = mat2cell(X, sX(1), M)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!