Create a nested structure using a variable as field name
13 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Luca Amerio
el 3 de Nov. de 2016
Comentada: Luca Amerio
el 3 de Nov. de 2016
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?
0 comentarios
Respuesta aceptada
Jan
el 3 de Nov. de 2016
Editada: Jan
el 3 de Nov. de 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
Más respuestas (0)
Ver también
Categorías
Más información sobre Structures en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!