MATLAB Answers


struct to cell array

Asked by Steve Miller on 18 Jan 2019
Latest activity Edited by Stephen Cobeldick on 19 Jan 2019
I was working with structs and cell array and I came across something I didn't quite understand.
If I have a struct and its transpose -
s = struct('A',{1;2;3}) % 3x1 struct
sT = struct('A',{1,2,3}) % 1x3 struct
Then using dot notation to select a single field will produce a cell array with the same dimensions either way -
d = {s.A} % 1x3 cell
dT = {sT.A} % 1x3 cell
Why aren't d and dT transposes of each other?

  1 Comment

"Why aren't d and dT transposes of each other?"
Comma-separated lists are a powerful and useful feature, once their concept is understood.
The reason why is because the comma-separated list that you generated is not one variable as you seem to think (which can have a size or orientation) but is simply a list of scalar variables, and such a list does not have anything like a size or orientation. It is just a list, separated by commas. Both of your examples produce exactly the same comma-separated list:
and then call the cell array constructor with that (same) comma-separated list:
The size of your output (if any) depends entirely on the function that you are entering that comma-separated list into as input arguments (i.e. the cell array constructor). Of course with matrices/arrays the order of the comma-separated list can be different, depending on the orientation of the array, but for vectors their orientation makes absolutely no difference.
So, simply put, a comma-separated list does not have size, therefore the output size depends only on the function that you are using that comma-separated list with.
Read these to know more:

Sign in to comment.




2 Answers

Answer by per isakson
on 18 Jan 2019
Edited by per isakson
on 18 Jan 2019
 Accepted Answer

Why? Because Matlab works that way.
>> nums.f
ans =
ans =
ans =
outputs a list and
concatenates the list horisontally into a cell array.


Sign in to comment.

Answer by Walter Roberson
on 18 Jan 2019

What you are doing is structure expansion, which is comma separated lists. So you are getting
{sT(1).A, sT(2).A, sT(3).A}


Sign in to comment.