How to access all elements within a structured cell array without looping?

조회 수: 69 (최근 30일)
I have a variable that look like this:
a_structure{1}.field1=vector1;
a_structure{2}.field1=vector2;
a_structure{3}.field1=vector3;
Without looping, how do I obtain the matrix that puts vector1 in column 1, vector2 in column 2 and vector3 in column 3?
Note: The {} in there is intentional. I am not using the structure(1).field1 syntax. I could get there, but would have thousands of lines of code to change.

채택된 답변

Cam Salzberger
Cam Salzberger 2020년 3월 4일
Hello Steve,
I would suggest restructuring your data storage. If you did use the struct array method of storage, I believe it would be as simple as [a_structure.field1]. But taking it as it is, you can fairly easily transform the cell array of similar structures into a struct array with this:
sArr = [a_structure{:}];
And then extract the fields into a matrix with my original method:
A = [sArr.field1];
The structures would need to be similar though. If the first line fails because they are not, you may need to use cellfun:
C = cellfun(@(c) c.field1, a_structure, 'UniformOutput', false);
A = [C{:}];
  댓글 수: 1
SteveR
SteveR 2020년 3월 4일
WE HAVE A WINNER!!!! Thanks a ton, Cam! I knew there was something better than a loop out there (I was going down the subsref rabbit hole when I decided to post my first question here instead).
Rest assured, I will update my code to () syntax when I have enough spare time to ensure equivalent performance across the multitude of twists and turns my code takes. :)

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Stephen23
Stephen23 2020년 3월 4일
편집: Stephen23 2020년 3월 4일
"I am not using the structure(1).field1 syntax"
You should be. It would allow you to use efficient syntaxes for accessing your data (i.e. like you are asking about now):
If all of the structures in the cell array have the same fields and have compatible sizes, then you can concatenate them together, e.g. where C is your cell array:
S = [C{:}]; % concatenate unfortunate cell of structs into better non-scalar structure.
M = [S.field1] % concatenate field1 vectors [S(1).field1,S(2).field1,S(3).field1,...]
Read more:
  댓글 수: 1
SteveR
SteveR 2020년 3월 4일
I realized my error regarding the superiority of the () syntax some time ago, but project deadlines have kept me from fixing the thousands of lines of code I have across several different analysis tools.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by