How do I index within a structure?

조회 수: 303(최근 30일)
Daniel Bridges
Daniel Bridges 2016년 2월 18일
답변: Mostafa 2020년 11월 15일
I am trying to take the mean of a structure.field column's number for multiple patients in a structure and store it for a plot of all the means later.
ShiftData(1).meanX = mean([patient(applicablepatients).Xtumorshift(1)])
This causes an error: Expected one output from a curly brace or dot indexing expression, but there were 65 results.
The MATLAB Help Documentation " Access Data in a Structure Array" states, "Note: You can index into part of a field only when you refer to a single element of a structure array. MATLAB® does not support statements such as S(1:2).X(1:50,1:80), which attempt to index into a field for multiple elements of the structure."
It appears that what I am trying to do is not supported. Am I understanding this correctly? Why is it not supported? Must I first store the data in a vector and then take the mean of that vector? Why?
Here is the contents (ID changed) of the second element in structure 'patient', patient(2):
ID: 999999
Xboneshift: [1x21 double]
Yboneshift: [1x21 double]
Zboneshift: [1x21 double]
Xtumorshift: [1x21 double]
Ytumorshift: [1x21 double]
Ztumorshift: [1x21 double]
TableLat: [1x21 double]
TableLong: [1x21 double]
TableVert: [1x21 double]
TxDate: {1x21 cell}
FxNumber: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21]
(Is the correct terminology "structure(element).field"?)

채택된 답변

Daniel Bridges
Daniel Bridges 2016년 5월 10일
편집: Daniel Bridges 2016년 5월 16일
Instead of indexing within an array stored in a structure element, I sorted the structure elements' arrays into a new structure, essentially David Sanchez's suggestion.
One can index into a structure field the same way one indexes into an array, if that field is an array. Working with ulrickls's dicomrt2matlab files, a DICOM-RT contour can be visualized:
scatter3(contours(9).Points(:,1),contours(9).Points(:,2),contours(9).Points(:,3))

추가 답변(2개)

David Sanchez
David Sanchez 2016년 2월 18일
% dummy struct
your_struct.field_1 = rand(5,1);
your_struct.field_2 = rand(5,1);
% array with field-mean
your_means = structfun(@mean,your_struct);
your_means =
0.6307
0.5440
  댓글 수: 3
Jason W
Jason W 2016년 7월 19일
I am wondering the same thing - the point of using structures was to help manage the large number of variables I had. Though dynamic indices has improved my code in storing values, I now need to create plots of those values and am forced to create many variables again.

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


Mostafa
Mostafa 2020년 11월 15일
I had the same question and I found the neatest solution in arrayfun. While structfun is useful for applying a function across fields, arrayfun lets us move across elements of one filed.
Considering the second example of David Sanchez:
your_means =arrayfun(@(x) mean(x.test), patient)
your_means =
75.6667 68.6667

Community Treasure Hunt

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

Start Hunting!

Translated by