2010-08-12 3 views
10

C'è un modo rapido (vale a dire una linea) per scaricare una raccolta di variabili "in" una struttura, utilizzando i nomi delle variabili come campi della struttura? Fondamentalmente la funzione "carica" ​​lo fa, ma il salvataggio e il caricamento in un file temporaneo sembrano brutti.Come posso spostare le variabili dentro e fuori una struttura simile a LOAD e SAVE in MATLAB?

Ad esempio:

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

x = var2struct(a,b) 

x.a 
x.b 

o meglio ancora:

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

Inoltre, per quanto riguarda l'inverso (cioè lo scarico dei valori di campo all'ambito corrente come variabili denominate dopo i campi) ?:

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

Inoltre, ecco un relativo newsgroup thread.

risposta

18

Oltre all'uso di LOAD e SAVE, non esiste alcuna funzione incorporata di cui sia a conoscenza. Tuttavia, si può solo fare le proprie funzioni, in questo modo:

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 

Lavorare dall'area di lavoro di base, è possibile utilizzare queste funzioni in questo modo:

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

Un paio di note:

  • Se si preferisce specificare gli argomenti su var2struct come nomi di variabili invece delle variabili stesse, qui è un'alternativa f unzione:

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

    E si può usare questo dal lavoro di base come segue:

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

    Purtroppo, è possibile utilizzare solo questa versione della funzione per ottenere variabili dal lavoro di base, non è l'area di lavoro di una funzione.

  • Un avvertimento con la funzione struct2var sopra è che creerà sempre le variabili nell'area di lavoro di base, non lo spazio di lavoro della funzione che chiama struct2var. Per creare le variabili in uno spazio di lavoro diverso da quello di base, si dovrà utilizzare questa linea in tale area di lavoro invece di chiamare struct2var:

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

non è possibile utilizzare Evalin ('chiamante', n) per la seconda versione di var2struct? Ad ogni modo, +1 per una bella soluzione che include tonnellate di Matlab avanzato. – Jonas

+0

@Jonas: l'uso di 'evalin ('chiamante', n)' per la seconda versione di 'var2struct' potrebbe effettivamente eseguire la valutazione nella funzione che chiama' evalin', che sarebbe 'var2struct' stesso e non la funzione che chiama 'var2struct'. Ecco perché mi piace la prima versione di 'var2struct' meglio ... sembra solo più pulito e più versatile. – gnovice

+0

D'oh !. Ricordo ora che ho fatto questo errore prima. – Jonas

Problemi correlati