2010-08-12 16 views
10

Có cách nào nhanh chóng (tức là một dòng) để kết xuất tập hợp các biến "trong" cấu trúc, sử dụng tên biến làm trường cấu trúc? Chức năng "tải" về cơ bản thực hiện điều này nhưng lưu và tải vào một tệp tạm thời có vẻ xấu xí.Làm thế nào tôi có thể di chuyển các biến vào và ra khỏi một cấu trúc giống như LOAD và SAVE trong MATLAB?

Ví dụ:

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

x = var2struct(a,b) 

x.a 
x.b 

hoặc tốt hơn nào:

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

Ngoài ra, những gì về điều ngược lại (tức là bán phá giá các giá trị lĩnh vực với phạm vi hiện tại như là các biến được đặt tên theo các lĩnh vực) ?:

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

Ngoài ra, đây là một liên quan newsgroup thread.

Trả lời

18

Ngoài việc sử dụng LOADSAVE, không có chức năng tích hợp mà tôi biết để thực hiện việc này. Tuy nhiên, bạn chỉ có thể thực hiện các chức năng của riêng mình, như vậy:

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 

Làm việc từ không gian làm việc cơ bản, bạn có thể sử dụng các chức năng như vậy:

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

Một vài lưu ý:

  • Nếu bạn muốn chỉ định các đối số cho var2struct làm tên biến thay vì các biến, thì đây là một thay thế f bôi:

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

    Và bạn sẽ sử dụng này từ không gian làm việc cơ bản như sau:

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

    Thật không may, bạn chỉ có thể sử dụng phiên bản này của các chức năng để có được biến từ không gian làm việc cơ bản, không phải là không gian làm việc của một hàm.

  • Thông báo trước với chức năng struct2var ở trên là nó sẽ luôn tạo biến trong vùng làm việc cơ sở, không phải không gian làm việc của hàm gọi struct2var. Để tạo các biến trong một không gian làm việc khác hơn là căn cứ, bạn sẽ phải sử dụng dòng này trong không gian làm việc đó thay vì gọi struct2var:

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

bạn không thể sử dụng evalin ('gọi', n) cho phiên bản thứ hai của var2struct? Dù sao, 1 cho một giải pháp đẹp bao gồm tấn Matlab tiên tiến. – Jonas

+0

@Jonas: sử dụng 'evalin ('người gọi', n)' cho phiên bản thứ hai của 'var2struct' sẽ thực sự thực hiện đánh giá trong hàm gọi' evalin', chính nó sẽ là 'var2struct' chứ không phải hàm mà các cuộc gọi 'var2struct'. Đó là lý do tại sao tôi thích phiên bản đầu tiên của 'var2struct' tốt hơn ... nó có vẻ sạch hơn và linh hoạt hơn. – gnovice

+0

D'oh !. Tôi nhớ bây giờ tôi đã phạm sai lầm đó trước đây. – Jonas

Các vấn đề liên quan