Convert Matlab Struct Array to Cell Array

Convert Matlab Struct Array to Cell Array

Can a Matlab struct array be converted to a cell array without iterating through the array?

I want each struct in the struct array to become one cell in the cell array. The command struct2cell doesn't seem to do it as it breaks out each field in the struct into a separate cell.

This has been posted to:

2

2 Answers

Try num2cell:

myStructCell = num2cell(myStruct);

For example:

>> myStruct(1).name = 'John';
>> myStruct(2).name = 'Paul';
>> myStruct

myStruct = 

1x2 struct array with fields:

    name

>> myStructCell = num2cell(myStruct)

myStructCell = 

    [1x1 struct]    [1x1 struct]

>> myStructCell{1}

ans = 

    name: 'John'

>> myStructCell{2}

ans = 

    name: 'Paul'

>> myStructCell{2}.name

ans =

Paul

Actually, I don't think that what I'm trying to do is necessary. Let me explain, in case it saves someone else from going down the same path.

The motivation for the above is that I want to extract a certain subfield from all structures in the struct array and have it in the form of a comma separated list:

myStruc(1).fieldX.subfieldA, ...
myStruc(2).fieldX.subfieldA, ...
myStruc(3).fieldX.subfieldA

I knew that I could generate a comma separated list by indexing into all cells into a 1D cell array via myCellArray{:}.

However, I found that there was actually an entire help page entitled "Comma-Separated Lists" showing that structs behave in the same way. So the above comma separated list is equal to myStruc(:).fieldX.subfieldA.

In fact, converting the struct array into a cell array wouldn't have worked because you can't use dot-indexing to access the fields after curly-brace indexing of the cell array. For example, if there was a vectorized way to convert myStruct(i) into myCell(i), I was hoping to be able to generate

myCellArray{1}.fieldX.subfieldA, ...
myCellArray{2}.fieldX.subfieldA, ...
myCellArray{3}.fieldX.subfieldA

via the expression myCell{:}.fieldX.subfieldA. The dot-indexing after the curly braces is a syntax error.

Lesson learned: Use struct array indexing directly to enable access to the struct fields & subfields.

***** CAVEAT *****

I only tested the generation of comma separated lists using multiple levels of dot-indexing combined with a scalar numerical array index, e.g., myCellArray{2}.fieldX.subfieldA. It doesn't work when with a vector numerical index in place of the scalar value 2, i.e., Matlab cannot handle myCellArray{:}.fieldX.subfieldA or myCellArray{2:3}.fieldX.subfieldA.

Oh well. :(

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Sophia Al-Mansoor
Author

Sophia Al-Mansoor

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.