Get data from multi-level struct using strings

4 次查看(过去 30 天)
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 CenterFile Exchange 中查找有关 Structures 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by