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

mat*_*ick 9 variables matlab structure save matlab-load

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

例如:

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

x = var2struct(a,b)

x.a
x.b
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

x = var2struct(['a';'b'])
Run Code Online (Sandbox Code Playgroud)

另外,反过来(即将字段值作为字段命名的变量转储到当前作用域)?

clear
x.a='asdf'
x.b=rand(10);
dumpstruct(x)
a
b 
Run Code Online (Sandbox Code Playgroud)

另外,这是一个相关的新闻组主题.

gno*_*ice 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
Run Code Online (Sandbox Code Playgroud)

在基础工作区中工作,您可以使用以下函数:

a = 'adsf'
b = rand(10);
x = var2struct(a,b);
clear a b
struct2var(x);
Run Code Online (Sandbox Code Playgroud)

几个笔记:

  • 如果您希望将参数指定var2struct为变量名而不是变量本身,则可以使用以下替代函数:

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

    您可以在基础工作区中使用它,如下所示:

    x = var2struct('a','b');
    
    Run Code Online (Sandbox Code Playgroud)

    不幸的是,您只能使用此版本的函数从基础工作区获取变量,而不是函数的工作空间.

  • struct2var上面这个函数的一个警告是,它总是在基本工作空间中创建变量,而不是函数调用的工作空间struct2var.要在基础以外的工作空间中创建变量,您必须在该工作空间中使用此行而不是调用struct2var:

    cellfun(@(n,v) assignin('caller',n,v),fieldnames(x),struct2cell(x));
    
    Run Code Online (Sandbox Code Playgroud)