【问题标题】:How can I move variables into and out of a structure akin to LOAD and SAVE in MATLAB?如何在 MATLAB 中将变量移入和移出类似于 LOAD 和 SAVE 的结构?
【发布时间】:2011-03-29 02:12:23
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: matlab variables save structure matlab-load


    【解决方案1】:

    除了使用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 的漂亮解决方案 +1。
    • @Jonas:将evalin('caller',n) 用于var2struct 的第二个版本实际上会在调用evalin 的函数中执行评估,这将是var2struct 本身而不是调用的函数var2struct。这就是为什么我更喜欢var2struct 的第一个版本……它看起来更干净、更通用。
    • 噢!我现在记得我以前犯过这个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2018-04-26
    相关资源
    最近更新 更多