You don't need anything crazy, just reshape and num2cell
c = reshape(num2cell([m1(:), m2(:), m3(:), m4(:)], 2), size(m1));
I think this is a good general way to do it.
Edit: 2015/07/25 14:45
Based on your comments it seems like what you have is a cell array
M = {m1, m2, ..., mn}
I think you're saying that each m is 2x2, but I'll assume it's qxr
And you want to get it in the form,
c = {[m1(1,1), m2(1,1), ..., mn(1,1)], [m1(1,2), m2(1,2), ..., mn(1,2)], ..., [m1(1,q), m1(1,q), ..., mn(1,q)]
[m1(2,1), m2(2,1), ..., mn(2,1)], [m1(2,2), m2(2,2), ..., mn(2,2)], ..., [m1(2,q), m1(2,q), ..., mn(2,q)]
...
[m1(r,1), m2(r,1), ..., mn(r,1)], [m1(r,2), m2(r,2), ..., mn(r,2)], ..., [m1(r,q), m1(r,q), ..., mn(r,q)]}
If all this is accurate, then the code you need is
c = reshape(num2cell(cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)), 2), size(M{1}));
So a good way to test this is to make a M, then run the code
M = arrayfun(@(i) randi(100, 7, 3), 1:14, 'uni', 0);
c = reshape(num2cell(cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)), 2), size(M{1}));
the only new piece compared to the above code is the cell2mat(cellfun(@(m) m(:), M(:)', 'uni', 0)). This takes M (which is a cell array of matrices) and first turns it into a cell array of column vectors (by the cellfun). It then concatenates those columns into a matrix which each row is a m1(i,j), m2(i,j), ... set. Then like before we split each row into its own cell of a cell array, then reshape it so it's the same size as one of the m's.