9

是否有一种快速的方法(即一行)将变量集合“转储”到结构中,使用变量名称作为结构字段?“加载”功能基本上是这样做的,但保存和加载到临时文件似乎很难看。

例如:

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 

另外,这是一个相关的新闻组线程

4

1 回答 1

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为变量名而不是变量本身,这里有一个替代函数:

    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));
    
于 2010-08-12T18:18:29.683 回答