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.

 Akzeptierte Antwort

Guillaume
Guillaume am 30 Jul. 2019
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 Kommentare

hrushikesh kyathari
hrushikesh kyathari am 31 Jul. 2019
Bearbeitet: hrushikesh kyathari am 31 Jul. 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 am 31 Jul. 2019
Bearbeitet: Guillaume am 31 Jul. 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), [])

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Version

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by