How do I index within a structure?
Afficher commentaires plus anciens
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"?)
Réponse acceptée
Plus de réponses (2)
David Sanchez
le 18 Fév 2016
% 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 commentaires
David Sanchez
le 18 Fév 2016
By the way, your terminology "structure(element).field" is correct.
For your case, you can also try something like this:
%dummy struct array
patient(1).name = 'John Doe';
patient(1).billing = 127.00;
patient(1).test = [79, 75, 73];
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68, 70, 68];
for k=1:length(patient)
your_means(k) = mean(patient(k).test);
end
your_means =
75.6667 68.6667
Daniel Bridges
le 19 Fév 2016
Modifié(e) : Daniel Bridges
le 16 Mai 2016
Jason W
le 19 Juil 2016
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
le 15 Nov 2020
0 votes
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
Catégories
En savoir plus sur Structures dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!