Assign value to field of nested structure in a structure array
Ältere Kommentare anzeigen
Hello, I will use a simple example to show what I am after. I have a structure array 'person' with fields ('First_Name' , 'Last_Name' , 'FamilyInfo'), where 'FamilyInfo' is a structure with three fields ('FatherName' , 'MotherName' , 'NumberOfSiblings').
I create 4 elements in person structure array and fill all the 'First_Name' and 'Last_Name' fields but the 'FamilyInfo' field is left empty. Now, for all the 4 elements in the 'person' structure array, I want to assign at once the same value to the field "NumberOfsiblings" in the nested structure 'Family', but MATLAB throws an error. Here is the code;
Create an empty structre array
person = struct('First_Name',[],'Last_Name',[],...
'FamilyInfo',struct('FatherName',[],'MotherName',[],'NumberOfsiblings',[]));
Create elements in the array but the Family field is left empty
FirstNames = {'Joe','Jack','William','Averel'};
[person(1:4).First_Name]=deal(FirstNames{:});
[person(1:4).Last_Name]=deal('Dalton');
For all the elements in person structure array, assign the same value (3) to the NumberOfsiblings field, of the Family field.
[person(1:4).FamilyInfo.NumerOfsiblings] = 3;
Error message pops up;
Expected one output from a curly brace or dot indexing expression, but there were 4 results.
Is there a way to do it without using a for loop? One-line code is preferred. Thanks
2 Kommentare
Pico Technology
am 17 Okt. 2016
Is this the actual code run or should it be
[person(1:4).FamilyInfo.NumberOfsiblings] = 3;
Konstantinos Tompoulidis
am 17 Okt. 2016
Akzeptierte Antwort
Weitere Antworten (2)
This does not work "at once". Simply use a loop:
for k = 1:4
person(k).FamilyInfo.NumberOfsiblings = 3;
end
4 Kommentare
Konstantinos Tompoulidis
am 17 Okt. 2016
Guillaume
am 17 Okt. 2016
You can't concatenate sub fields like that. It's a limitation of matlab syntax.
If you are initialising the fields for the first time, then doing it as I've done in my answer is the best way, but note that if later you want to update some of the sub fields, you will have no choice but using a loop as in Jan's answer.
Jan
am 19 Okt. 2016
@Konstantinos: Discussing your wanting to avoid a loop takes more time than writing it. A loop is clean and efficient here, nice and compact.
broken_arrow
am 30 Sep. 2021
Bearbeitet: broken_arrow
am 30 Sep. 2021
I agree with @Konstantinos Tompoulidis that this syntax limitation is a nuisance, especially in OOP. After all, structs are constructed in such a way as to imitate the "physical nature" of the objects and one does not want to warp the structure just to comply with syntax limitations. Of course looping is possible, but according to the principle "vectorize where you can", it is not optimal. Reading and writing should also be possible with multiple outputs on multiple levels, like
[a(:).b.c(:).d] = deal(1)
Jos (10584)
am 17 Okt. 2016
[person(1:4).FamilyInfo] = deal(struct('NumerOfsiblings',3)) ;
1 Kommentar
Guillaume
am 17 Okt. 2016
That will actually remove the FatherName and MotherName subfields for any of the FamilyInfo fields that have them.
Kategorien
Mehr zu Workspace Variables and MAT Files finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!