Get data from multi-level struct using strings

4 visualizaciones (últimos 30 días)
Niklas Nylén
Niklas Nylén el 25 de Oct. de 2017
Comentada: Niklas Nylén el 6 de Nov. de 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?

Respuesta aceptada

Stephen23
Stephen23 el 25 de Oct. de 2017
Editada: Stephen23 el 25 de Oct. de 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 comentarios
Niklas Nylén
Niklas Nylén el 26 de Oct. de 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 el 6 de Nov. de 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} ':'];
end
data = setfield(data, C{:}, val);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Structures en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by