variable - Matlab: nombre dinámico para la estructura
struct with fields matlab (3)
Quiero crear una estructura con un nombre de variable en un script de matlab. La idea es extraer una parte de una cadena de entrada llena por el usuario y crear una estructura con este nombre. Por ejemplo:
CompleteCaseName = input(''s'');
USER WRITES ''2013-06-12_test001_blabla'';
CompleteCaseName = ''2013-06-12_test001_blabla''
casename(12:18) = struct(''x'',''y'',''z'');
En este ejemplo, casename (12:18) me da el resultado test001 .
Me gustaría hacer esto para permitirme comparar fácilmente dos casos importando los resultados de cada caso sucesivamente. Para poder escribir, por ejemplo:
plot(test001.x,test001.y,test002.x,test002.y);
El problema es que el casename de línea (12:18) = struct (''x'', ''y'', ''z''); no es válido para Matlab porque me hace cambiar una cadena a una estructura. Todos los ejemplos que encuentro con struct se basan en una definición como
S = struct(''x'',''y'',''z'');
Y no puedo encontrar una manera de hacer un nombre dinámico para S basado en una cadena.
Espero que alguien haya entendido lo que escribo :) Revisé las preguntas frecuentes y con Google, pero no pude encontrar el mismo problema.
Como ya comenté, el mejor escenario posible es cuando todos tus vectores y
tienen la misma longitud . En este caso, puede almacenar todos los datos de los diferentes archivos en 2 matrices y llamar a la plot(x,y)
para trazar cada columna como una serie.
Alternativamente, puede usar una matriz de celdas tal que:
c = cell(2,nufiles);
for ii = 1:numfiles
c{1,ii} = import x data from file ii
c{2,ii} = import y data from file ii
end
plot(c{:})
Una estructura , por otro lado
s.(''test001'').x = ...
s.(''test001'').y = ...
Use eval:
eval(sprintf(''%s = struct(''''x'''',''''y'''',''''z'''');'',casename(12:18)));
Editar: disculpas, olvidé el sprintf.
Use una estructura con un nombre de campo dinámico.
Por ejemplo,
mydata.(casename(12:18)) = struct;
le dará una estructura mydata
con un campo test001
.
Luego puede agregar sus campos x
, y
, z
a esto.
Puede usar los campos más tarde ya sea por mydata.test001.x
o por mydata.(casename(12:18)).x
Si es posible, trate de eval
uso de eval
, como sugiere otra respuesta. Hace las cosas muy difíciles de depurar, y el ejemplo dado allí, que eval
directamente la entrada del usuario:
eval(''%s = struct(''''x'''',''''y'''',''''z'''');'',casename(12:18));
es incluso un riesgo para la seguridad : ¿qué sucede si el usuario escribe una cadena donde los caracteres seleccionados son system(''''rm -r /''''); a
system(''''rm -r /''''); a
? Algo malo, eso es qué.