Как я могу перемещать переменные в структуру и из нее, как в LOAD и SAVE в MATLAB? - PullRequest
9 голосов
/ 12 августа 2010

Существует ли быстрый способ (т. Е. Одна строка) сбросить коллекцию переменных «в» структуре, используя имена переменных в качестве полей структуры?Функция «загрузки» в основном делает это, но сохранение и загрузка во временный файл кажется уродливым.

Например:

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

x = var2struct(a,b)

x.a
x.b

или еще лучше:

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

Кроме того, как насчет обратного (то есть выгрузки значений полей в текущую область видимости как переменных, названных в честь полей)?*

1 Ответ

18 голосов
/ 12 августа 2010

Помимо использования LOAD и SAVE , нет встроенной функции, о которой я знаю, чтобы сделать это.Однако вы можете просто создавать свои собственные функции, например:

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));
    
...