2010-08-12 12 views
10

¿Hay una forma rápida (es decir, una línea) de volcar una colección de variables "en" una estructura, usando los nombres de las variables como campos de estructura? La función "cargar" básicamente hace esto, pero guardar y cargar en un archivo temporal parece feo.¿Cómo puedo mover variables dentro y fuera de una estructura similar a LOAD y SAVE en MATLAB?

Por ejemplo:

clear 
a = 'adsf' 
b = rand(10); 

x = var2struct(a,b) 

x.a 
x.b 

o mejor aún:

x = var2struct(['a';'b']) 

Además, lo que sobre el reverso (es decir, vertido los valores de campo al ámbito actual como variables con nombres de los campos) ?:

clear 
x.a='asdf' 
x.b=rand(10); 
dumpstruct(x) 
a 
b 

Además, hay un archivo relacionado newsgroup thread.

Respuesta

18

Además de usar LOAD y SAVE, no hay una función incorporada que conozca para hacer esto. Sin embargo, usted podría hacer sus propias funciones, así:

function s = var2struct(varargin) 
    names = arrayfun(@inputname,1:nargin,'UniformOutput',false); 
    s = cell2struct(varargin,names,2); 
end 

function struct2var(s) 
    cellfun(@(n,v) assignin('base',n,v),fieldnames(s),struct2cell(s)); 
end 

Trabajando desde el espacio de trabajo de base, puede utilizar estas funciones, así:

a = 'adsf' 
b = rand(10); 
x = var2struct(a,b); 
clear a b 
struct2var(x); 

Un par de notas:

  • Si prefiere especificar los argumentos a var2struct como los nombres de las variables en lugar de las variables en sí, aquí hay una alternativa f unción:

    function s = var2struct(varargin) 
        values = cellfun(@(n) evalin('base',n),varargin,'UniformOutput',false); 
        s = cell2struct(values,varargin,2); 
    end 
    

    Y se usaría esto desde el espacio de trabajo de base de la siguiente manera:

    x = var2struct('a','b'); 
    

    Por desgracia, sólo se puede utilizar esta versión de la función para obtener las variables del espacio de trabajo de base, no el espacio de trabajo de una función.

  • Una advertencia con la función struct2var anterior es que siempre creará las variables en el espacio de trabajo base, no el espacio de trabajo de la función que llama al struct2var. Para crear variables en un espacio de trabajo distinto a la base, que tendría que utilizar esta línea en ese espacio de trabajo en lugar de llamar struct2var:

    cellfun(@(n,v) assignin('caller',n,v),fieldnames(x),struct2cell(x)); 
    
+0

No se puede utilizar evalin ('persona que llama, n) para el segunda versión de var2struct? De todos modos, +1 para una hermosa solución que incluye toneladas de Matlab avanzado. – Jonas

+0

@Jonas: usar 'evalin ('caller', n)' para la segunda versión de 'var2struct' en realidad realizaría la evaluación en la función que llama a' evalin', que sería 'var2struct' y no la función que llama 'var2struct'. Es por eso que me gusta más la primera versión de 'var2struct' ... parece más limpia y más versátil. – gnovice

+0

D'oh !. Recuerdo que ya cometí ese error. – Jonas

Cuestiones relacionadas