Stuart’s MATLAB Videos

Watch and Learn

How to do a matrix reshape by ‘blocks’ 6

Posted by Doug Hull,

This week’s video covers a non-standard way of reshaping a matrix. Instead of using the reshape function, this kind of matrix manipulation must be done with for loops. This matrix reshape operation treats submatrices within the original matrix as a unit. I suspect there are many other ways of doing this, and would love to hear about them in the comments.

6 CommentsOldest to Newest

Matt Fig replied on : 1 of 6
Here is one version of the obligatory one-liner. newMat=cell2mat(reshape(mat2cell(longMat,rSize*ones(1,n),cSize),5,4).'); However, this is only significantly faster for large systems. I have written optimized, hard-to-read MATLAB code in the past, and in order to help those who might be reading it in the future I often put the straightforward FOR loop(s) version in the comments. This serves several purposes. Among them are that it lets any future user see more easily what is going on and quickly get to maintenance concerns. Thanks for another great video, Doug!
Sean de Wolski replied on : 2 of 6
And the obligatory one-liner without cells: %Some parameters blksz = 3; %block size in row/col nrep = 20; %block repetitions nr = 4; %number of rows of blocks nc = 5; %number of columns of blocks %Determinant sample data A = reshape(1:(blksz*blksz*nrep),blksz,[])'; %Engine one line version: NewA = reshape(permute(reshape(permute(reshape(A.',blksz,blksz,[]),[2 1 3]),blksz,blksz*nc,[]),[2 1 3]),blksz*nc,blksz*nr)'; %Engine in pieces: B = reshape(A.',blksz,blksz,[]); %reshape the transpose to 3d with each block a 3x3 C = permute(B,[2 1 3]); %transpose each block D = reshape(C,blksz,blksz*nc,[]); %reshape to nr planes that need to be stacked vertically E = permute(D,[2 1 3]); %transpose each plane F = reshape(E,blksz*nc,blksz*nr)'; %reshape into a matrix and transpose
Yesid replied on : 3 of 6
hello.. How do I automatically concatenate several pages of the same multidimensional array.? cc=cat(1,xyz(:,:,1),xyz(:,:,2),xyz(:,:,3),...,xyz(:,:,n));
doug replied on : 4 of 6
@Yesid, Am I missing something? Aren't they already concatenated? How is xyz different than what you are trying to get for cc?
Sulaymon Eshkabilov replied on : 5 of 6
Here is a simpler one-liner code without any loop iteration: NEWmat = repmat(longMAT(1:3,:), 4, 5);
Sulaymon Eshkabilov replied on : 6 of 6
Make it simple but not simpler ... :). This is all what is needed to avoid any loops from the given task on step 1 and 2. imagesc(repmat(((reshape((1:9),3,3))+750), 4,5))