Как я могу перемещать переменные в структуру и из нее, как в LOAD и SAVE в MATLAB?

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

Например:

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 

Кроме того, вот связанная ветка группы новостей .

9
задан Shai 16 June 2013 в 11:54
поделиться

1 ответ

Кроме использования 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));
    
18
ответ дан 4 December 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: