Умный способ назначить несколько полей одновременно? - PullRequest
3 голосов
/ 23 февраля 2011

Из-за устаревших вызовов функций мне иногда приходится писать такие уродливые обертки, как этот

function return = someWrapper(someField)

a = someField.a;
b = someField.b;
% and so on, realistically it's more like ten variables that
% could actually be grouped in a struct

save('params.mat', 'a', 'b'); %etc.

% then, on another machine, a function loads params.mat, does the calculations
% and saves the result in result.mat containing the variables c,d,...

load('result.mat', 'c', 'd');
return.c = c;
return.d = d;
% again, it's more than just two return values

Таким образом, основная идея состоит в том, чтобы создать переменные с такими же именами, что и имена полей someField, запустить функцию и создать структуру return, используя имена возвращаемых переменных someFunction в качестве имен полей.

Есть ли какой-то способ упростить это с помощью некоторого цикла, например свыше fieldnames(someField)?


Или я действительно должен использовать другой подход? Поскольку дальнейшая обработка выполняется с помощью someField и result, я бы хотел продолжать использовать структуры, но, возможно, второй вопрос будет

Могут ли save и load перенаправлять имена переменных? То есть может, например, переменная a в params.mat должна быть сохранена с использованием someField.a в качестве значения вместо необходимости присваивать a = someField.a сначала?

Ответы [ 3 ]

6 голосов
/ 23 февраля 2011

Почему бы не что-то подобное?

, если это s:

s.a=1
s.b=2
s.c=3

Затем эта команда создает файл с именем "arguments" с переменными a, b, c:

save arguments.mat -struct s

И эта команда загружает переменные matfiles в структуру

r = load('arguments.mat')
2 голосов
/ 23 февраля 2011

Как насчет использования ASSIGNIN и динамических имен полей для циклического перемещения по полям структуры и создания соответствующих переменных в рабочей области:

function struct2base(s)

for f = fieldnames(s)'
   assignin('base', f{:}, s.(f{:}))
end
1 голос
/ 23 февраля 2011

Посмотрите на функцию deal () .

...