cell to matrix conversion with a slight modification

I have a 1×501 cell array(named C). Each element in the cell is a 4*4 matrix, which means I have 501 matrices of 4*4 dimensions. What I have to do is: for each matrix in the cell, all the elements in the particular matrix must be put in 1 row.
for example I have to convert
[1,2,3,4 [0,1,0,0
5,6,7,8 1,0,0,0 ..........so one upto 501 matrices
9,10,11,12 0,0,1,1
13,14,15,16] 0,0,0,1]
into
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,1
.............
........
so on upto 501 rows. ]
Help if possible.

 Réponse acceptée

Assuming that you mean a 501x16 matrix, then:
m = reshape(cat(3, yourcellarray{:}), [], numel(yourcellarray)).'
This concatenate the 501 matrices into a 4x4x501 matirx array, reshape that into a 16x501 matrix where each column is a flattened matrix and then transpose into a 501x16 matrix.

6 commentaires

hrushikesh kyathari
hrushikesh kyathari le 31 Juil 2019
Modifié(e) : hrushikesh kyathari le 31 Juil 2019
Thanks for the reply, but I guess I didn't explain my question properly which led to miscomprehension. I editted it, could you please look into it again.
Guillaume
Guillaume le 31 Juil 2019
Modifié(e) : Guillaume le 31 Juil 2019
Your edit is exactly what my code does except that since matlab is column major, the matrix
[1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16]
gets reshaped into
[1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16]
If the order does really matter then you ought to work with columns rather than rows as that would avoid a lot of expensive (in term of time) transpositions / permutations, but this will do:
m = reshape(permute(cat(3, yourcellarray{:}), [3, 2, 1]), numel(yourcellarray), [])
Thanks a lot, I actually did a silly mistake as I copied your 1st answer but gave the output as my original cell .My bad, sorry for that.
The order does matter for me, I need the order to be as [1,2,3,5,6,7,9,10,11,4,8,12]
I actually don't need the last row. I would be pleased if you could help me here.
If by last row, you mean the last cell of the cell array, then just delete it before the conversion, or:
m = reshape(permute(cat(3, yourcellarray{1:end-1}), [3, 2, 1]), numel(yourcellarray)-1, [])
no, I meant the last row of each matrix, so if a matrix is
[1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16]
I need it to be made as [1,2,3,5,6,7,9,10,11,4,8,12]. So I want to apply this to all the matrices
So this would result in final outcome as 501*12 martix.
Well, then simply remove the last 4 columns from the output
croppedm = m(:, 1:end-4);
or you can do:
m = cat(3, yourcellarray{:})
m = reshape(permute(m(1:end-1, :, :), [3, 2, 1]), numel(yourcellarray), [])

Connectez-vous pour commenter.

Plus de réponses (0)

Produits

Version

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by