Get data from multi-level struct using strings

4 ビュー (過去 30 日間)
Niklas Nylén
Niklas Nylén 2017 年 10 月 25 日
コメント済み: Niklas Nylén 2017 年 11 月 6 日
I need to read data into matlab where a text file specifies the structure and index of the data and another file contains the data itself.
Currently the implementation is done using an eval statement, e.g.
eval(['data.' dataName '=value;'])
I would like to use parfor instead since there are a many large files to process but parfor doesn't allow eval. I tried fixing it by replacing the eval statement with:
data.(dataName) = value;
The issue I'm running into is that dataName specifies multiple levels of a struct, e.g. dataName = 'a.b.c', which gives me an error.
Is there any way to make this work?

採用された回答

Stephen23
Stephen23 2017 年 10 月 25 日
編集済み: Stephen23 2017 年 10 月 25 日
You can use setfield and getfield with nested fields. Unfortunately the help description is quite vague on how to do this, but all you need to do is supply all the fieldnames individually:
>> val = 1;
>> name = 'a.b.c';
>> C = regexp(name,'\.','split');
>> data = setfield(struct(),C{:},val);
>> data.a.b.c
ans = 1
This is much more reliable than using eval, although it is possible that setting fields like this is also not permitted within a parfor loop, but it is worth a try.
  7 件のコメント
Niklas Nylén
Niklas Nylén 2017 年 10 月 26 日
Great! I tried to do this way before but I didn't know about the num2cell function. Thank you.
Niklas Nylén
Niklas Nylén 2017 年 11 月 6 日
So, the final version, which also supports assigning arrays as value:
name = 'aaa.bb(3).cc.de(7)';
data = struct();
val = [5 3 2];
C = regexp(name,'[\.()]+','split');
C = C(~cellfun(@isempty, C));
V = str2double(C);
idx = isfinite(V);
C(idx) = num2cell(num2cell(V(idx)));
if idx(end)
C{end} = [C{end} ':'];
end
data = setfield(data, C{:}, val);

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeStructures についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by