MATLAB Answers

How to transpose a cell array blockwise?

57 views (last 30 days)
David Mrozek
David Mrozek on 3 Mar 2021
Edited: James Tursa on 4 Mar 2021
I have created a dataset D with one column and 3 rows which includes the following elements:
D1 = {1, 1} , 'Text1' with a total repetition of 15 times (1 row and 15 columns)
D2 = {2, 1} , Includes 15 300x3 double elements (1 row and 15 columns) named data1
D3 = {3, 1} , 'Text2' with a total repetition of 15 times (1 row and 15 columns)
Therefore I have the following cell array if i open D1, D2, and D3:
Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1 Text1
data1 data1 data1 data1 data1 data1 data1 data1 data1 data1 data1 data1 data1 data1 data1
Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2 Text2
When using the transpose option I would like to get the following order:
Text1
data1
Text2
Text1
data1
Text2
Text1
data1
Text2
etc.
However I am not sure how to write the code for it properly. Is there a matlba function to create "block elements" for transposing the above mentioned example?
Stay safe and healthy
David
  5 Comments
David Mrozek
David Mrozek on 3 Mar 2021
I am, to this kind of desired data order, not responsible.
I need the data in this order to process it further for the CATIA V5 R21 Spline-Generator which converts such data structures into geometrical splines.
Since CATIA V5 offered a macro-based option for the Spline-Generator which I have not written myself, I am unable the meddle with the programming architecture of CATIA.
Hence I decided to write a matlab file which is prepared in the right order.
Therefore I require this this particular data order.
The first text "StartCurve" itself starts the macro, as I noticed, and generates the geometrical structure from the data beneath the first text.
The 2nd text "EndCurve" beneath the data stops the Spline-Generator. This leads me to the conclusion that the macro Spline-Generator in CATIA work row-based and not column-based.
This results in the following order:
Text1
data1
Text2
Text1
data1
Text2
I hope that this explains the background behind data structure a little bit better.

Sign in to comment.

Accepted Answer

James Tursa
James Tursa on 3 Mar 2021
E.g., brute force approach
result = reshape([D{1};D{2};D{3}],[],1);
  4 Comments
David Mrozek
David Mrozek on 4 Mar 2021
Thank you very much for this detailed explanation.

Sign in to comment.

More Answers (1)

Bjorn Gustavsson
Bjorn Gustavsson on 3 Mar 2021
If I understand you right this should do what you want:
QWE = {'T1_1','T1_2','T1_3';randn(1),randn(2),randn(3);'T2_1','T2_2','T2_3'};
%
%QWE =
%
% 3×3 cell array
%
% 'T1_1' 'T1_2' 'T1_3'
% [0.5377] [2×2 double] [3×3 double]
% 'T2_1' 'T2_2' 'T2_3'
%
QWE(:)
%
%
%
% 9×1 cell array
%
% 'T1_1'
% [ 0.5377]
% 'T2_1'
% 'T1_2'
% [2×2 double]
% 'T2_2'
% 'T1_3'
% [3×3 double]
% 'T2_3'
This should extend well.
HTH
  1 Comment
David Mrozek
David Mrozek on 3 Mar 2021
It works if the array is unnested. However, I have some troubles to apply your code for a nested cell array.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!