For loop to split matrix to equal sized sub-matrices
loops, matlab, octave
Solution
Well, I know that the poster explicitly asked for a `for` loop, and Jeff Mather's answer provided exactly that.
But still I got curious whether it is possible to decompose a matrix into tiles (sub-matrices) of a given size without a loop. In case someone else is curious, too, here's what I have come up with:
T = permute(reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n, m, []), [2 1 3])
transforms a two-dimensional array `A` into a three-dimensional array `T`, where each 2d slice `T(:, :, i)` is one of the tiles of size `m` x `n`. The third index enumerates the tiles in standard Matlab linearized order, tile rows first.
The variant
T = permute(reshape(A, size(A, 1), n, []), [2 1 3]);
T = permute(reshape(T, n, m, [], size(T, 3)), [2 1 3 4]);
makes `T` a four-dimensional array where `T(:, :, i, j)` gives the 2d slice with tile indices `i, j`.
Coming up with these expressions feels a bit like solving a sliding puzzle. ;-)
Problem
Given a square matrix of say size `400x400`, how would I go about splitting this into constituent sub-matrices of `20x20` using a for-loop? I can't even think where to begin! I imagine I want something like : ``` [x,y] = size(matrix) for i = 1:20:x for j = 1:20:y ``` but I'm unsure how I would proceed. Thoughts?