MATLAB: Create multiple submatrices from a large matrix

for loopindexingMATLABmatrixmatrix manipulationsubmatrix creationvectorization

Dear All communtity members,
I want to write a code that creates multiple submatrices from a large matrix either through a loop or by vectorization.
The large matrix has a dimension of 54×7056 and I want to create 16 submatrices selected from different columns.
The submatrices shall be selected and repeated as following;
sub1= column, 1, 9 to 17, 25 to 33, 41 to 49…………………….. and 7049 to 7056.
sub2= column, 1 to 2, 10 to 18,26 to 34, 42 to 50……………… and 7050 to 7056.
sub3= column, 1 to 3, 11 to 19,27 to 35, 43 to 51……………… and 7051 to 7056.
sub4= column, 1 to 4, 12 to 20, 28 to 36, 44 to 52…………….. and 7052 to 7056.
sub5= column, 1 to 5, 13 to 21, 29 to 37, 45 to 53…..7037 to 7045, and 7053 to 7056.
sub6= column, 1 to 6, 14 to 22, 30 to 38, 46 to 54…. 7038 to 7046, and 7054 to 7056.
sub7= column, 1 to 7, 15 to 23, 31 to 39, 47 to 55, .. 7039 to 7047, and 7055 to 7056.
sub8= column, 1 to 8, 16 to 24, 32 to 40, 48 to 56…. 7040 to 7048, and 7056.
sub9= column, 1 to 9, 17 to 25, 33 to 41, 49 to 57………………. and 7041 to 7049.
sub10= column, 2 to 10, 18 to 26, 34 to 42, 50 to 58…………… and 7042 to 7050.
sub11= column, 3 to 11, 19 to 27, 35 to 43, 51 to 59……………. and 7043 to 7051.
sub12= column, 4 to 12, 20 to 28, 36 to 44, 52 to 60…………… and 7044 to 7052.
sub13= column, 5 to 13, 21 to 29, 37 to 45, 53 to 61…………… and 7045 to 7053.
sub14= column, 6 to 14, 22 to 30, 38 to 46, 54 to 62…………… and 7046 to 7054.
sub15= column, 7 to 15, 23 to 31, 39 to 47, 55 to 63…………… and 7047 to 7055.
sub16= column, 8 to 16, 24 to 32, 40 to 48, 56 to 64…………… and 7048 to 7056.
I appreciate all help and tips.
Thanks in advance!

Best Answer

Probably better code using logical indexing
M = rand(54,7056);
[m,n] = size(M);
pattern = circshift([true(1,9) false(1,7)], -8);
pattern = repmat(pattern, 1, n/16);
pattern = pattern(1:n);
s = struct();
for r=1:16
s.(sprintf('sub%d',r)) = M(:,pattern);
pattern = circshift(pattern, 1);
end
s