Есть ли быстрый способ (т.е. одна строка), чтобы сбросить коллекцию переменных "в" структуре, используя имена переменных в качестве полей структуры? Функция «загрузки» в основном делает это, но сохранение и загрузка во временный файл кажется уродливым.
Например:
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
Кроме того, вот связанная ветка группы новостей .
Кроме использования 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));