2010-08-12 2 views
10

변수 이름을 구조 필드로 사용하여 구조의 "in"변수 모음을 덤프하는 빠른 방법 (예 : 한 줄)이 있습니까? "로드"기능은 기본적으로이 작업을 수행하지만 임시 파일에 저장 및로드하는 것은보기 흉한 것처럼 보입니다. 더 좋은MATLAB에서 LOAD 및 SAVE와 유사한 구조로 변수를 이동하거나 이동하는 방법은 무엇입니까?

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

x = var2struct(a,b) 

x.a 
x.b 

또는 : 예

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

또한 역방향 어떻 (즉 필드 따서 변수로서 현재의 스코프 필드 값 덤핑)?

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

또한 여기는 관련 newsgroup thread입니다.

답변

18

LOADSAVE을 사용하는 것 외에, 내가 알고있는 내장 함수가 없습니다. 그러나, 당신은 너무처럼, 자신의 기능을 할 수 있습니다 : 기본 작업 공간에서 작업을

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 

, 당신과 같이 이러한 기능을 사용할 수 있습니다

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

몇 노트 :

  • 변수 자체 대신 변수 이름으로 var2struct의 인수를 지정하려면 다음과 같이하십시오. f 기름 부음 :

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

    그리고 다음과 같이 기본 작업 공간에서이 작업을 사용합니다 :

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

    를 불행하게도, 당신은 기본 작업 영역에서 변수를 얻을 수있는 기능이 버전을 사용할 수없는 작업 공간 함수의.

  • 위의 struct2var 함수가있는주의 사항은 struct2var을 호출하는 함수의 작업 영역이 아니라 기본 작업 영역에 항상 변수를 생성한다는 것입니다. 기본 이외의 작업 공간에서 변수를 만들려면 대신 struct2var를 호출하는 작업 공간이 줄을 사용해야합니다 :

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

당신은을 위해 evalin ('발신자', N)를 사용할 수 없습니다 var2struct의 두 번째 버전? 어쨌든, 고급 Matlab을 포함하는 아름다운 솔루션을 얻으려면 +1하십시오. – Jonas

+0

@Jonas :'var2struct'의 두 번째 버전에 대해'evalin ('caller', n)'을 사용하면'evalin'을 호출하는 함수에서 실제로 평가를 수행합니다.이 함수는 호출하는 함수가 아닌'var2struct' 'var2struct'. 그래서'var2struct'의 첫 번째 버전이 더 좋았습니다 ... 더 깨끗하고 융통성있게 보입니다. – gnovice

+0

D' oh !. 나는 그 실수를 저지른 것을 기억한다. – Jonas