如何将变量移入和移出类似于MATLAB中的LOAD和SAVE结构?

9
有没有一种快速的方法(例如一行代码),可以将一组变量“倒入”一个结构中,并使用变量名称作为结构字段?“load”函数基本上可以实现此功能,但保存和加载到临时文件似乎很麻烦。
例如:
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 

此外,这里有一个相关的新闻组讨论帖
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));
    

    第二个版本的var2struct不能使用evalin('caller',n)吗?无论如何,这是一个包含大量高级Matlab的美妙解决方案,给你点赞。 - Jonas
    @Jonas:对于var2struct的第二个版本,使用evalin('caller',n)实际上会在调用evalin的函数中执行求值,这将是var2struct本身而不是调用var2struct的函数。这就是为什么我更喜欢var2struct的第一个版本...它看起来更简洁、更通用。 - gnovice
    糟糕!我现在记起来了,我以前犯过这个错误。 - Jonas

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接