Create a nested structure using a variable as field name

46 ビュー (過去 30 日間)
Luca Amerio
Luca Amerio 2016 年 11 月 3 日
コメント済み: Luca Amerio 2016 年 11 月 3 日
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?

採用された回答

Jan
Jan 2016 年 11 月 3 日
編集済み: Jan 2016 年 11 月 3 日
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 件のコメント
Luca Amerio
Luca Amerio 2016 年 11 月 3 日
Didn't know these two functions. They are exactly what I was looking for. Thank you

サインインしてコメントする。

その他の回答 (0 件)

タグ

製品

Community Treasure Hunt

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

Start Hunting!

Translated by