Create a nested structure using a variable as field name

16 visualizzazioni (ultimi 30 giorni)
Hi everybody
Lets say that I have a variable
path='\levelOne\levelTwo\levelThree'
of which I don't know the number of levels and that I would like to use this path as "address" of a variable inside a structure, such that
S.levelOne.levelTwo.levelThree=1;
Now, I know that I can use string variables to set or get structure fileds using a notation like
fieldName='myField';
S.(fieldName)=1;
But this works with one level or, with a bit of string manipulation, if I know the number of levels I must call. I'm thinking at something like:
path='\levelOne\levelTwo\levelThree'
fields=strsplit(path,'\');
[fieldOne,fieldTwo,fieldThree]=deal(fields{2:end});
S.(fieldOne).(fieldTwo).(fieldThree)=1;
Can you think of any kind of trick so that I can write a function that adapt itself to the number of levels I pass it through the path variable?

Risposta accettata

Jan
Jan il 3 Nov 2016
Modificato: Jan il 3 Nov 2016
This is a job for the getfield and setfield commands:
PathStr = '\levelOne\levelTwo\levelThree'; % Do not shadow the PATH command
Fields = strsplit(PathStr,'\'); % Ignore initial blank field later
S = [];
S = setfield(S, Fields{2:end}, 1)
V = getfield(S, Fields{2:end})
Internally this calls subsassgn, which can be done directly also. I'd move this into a function, which ignores at least a leading separator automatically:
function S = SetPathField(S, PathStr, Value)
if length(PathStr) >= 1 && PathStr(1) == '\'
Fields = regexp(PathStr(2:end), '\', 'split');
else
Fields = regexp(PathStr, '\', 'split');
end
Types = cell(1, numel(Fields));
Types(:) = {'.'};
S = subsasgn(S, struct('type', Types, 'subs', Fields), Value);
end
  1 Commento
Luca Amerio
Luca Amerio il 3 Nov 2016
Didn't know these two functions. They are exactly what I was looking for. Thank you

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Search Path in Help Center e File Exchange

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by