Effacer les filtres
Effacer les filtres

Get data from multi-level struct using strings

8 vues (au cours des 30 derniers jours)
Niklas Nylén
Niklas Nylén le 25 Oct 2017
Commenté : Niklas Nylén le 6 Nov 2017
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?

Réponse acceptée

Stephen23 le 25 Oct 2017
Modifié(e) : Stephen23 le 25 Oct 2017
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 commentaires
Niklas Nylén
Niklas Nylén le 26 Oct 2017
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 le 6 Nov 2017
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} ':'];
data = setfield(data, C{:}, val);

Connectez-vous pour commenter.

Plus de réponses (0)


En savoir plus sur Structures dans Help Center et File Exchange


Community Treasure Hunt

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

Start Hunting!

Translated by