필터 지우기
필터 지우기

How do I index within a structure?

조회 수: 57 (최근 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
Daniel Bridges
Daniel Bridges 2016년 2월 19일
편집: Daniel Bridges 2016년 5월 16일
Thank you for telling me of structfun. However, I cannot use it directly because the structure contains a non-scalar field, namely, the treatment date.
Your second method is similar to what I implemented: I want to average "across" element fields, e.g. averaging the columns in your test field for all elements: 79 and 68, 75 and 70, 73 and 68. To this end I wrote this code:
for loop = 1:totalfractionnumber
for loop2 = 1:NumOfAppPat
shifts(loop).Xtumorshift(loop2) = patient(applicablepatients(loop2)).Xtumorshift(loop);
shifts(loop).Ytumorshift(loop2) = patient(applicablepatients(loop2)).Ytumorshift(loop);
shifts(loop).Ztumorshift(loop2) = patient(applicablepatients(loop2)).Ztumorshift(loop);
end
meanvectorx(loop) = mean(shifts(loop).Xtumorshift);
meanvectory(loop) = mean(shifts(loop).Ytumorshift);
meanvectorz(loop) = mean(shifts(loop).Ztumorshift);
stdvectorx(loop) = std(shifts(loop).Xtumorshift);
stdvectory(loop) = std(shifts(loop).Ytumorshift);
stdvectorz(loop) = std(shifts(loop).Ztumorshift);
end
However, it still appears less-than-ideal to have to create more vectors: It is not really using the data in the structure, but only copying from it.
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

카테고리

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

Community Treasure Hunt

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

Start Hunting!

Translated by