matlab: есть ли способ импортировать / продвигать переменные из структуры в текущее рабочее пространство? - PullRequest
2 голосов
/ 12 марта 2012
function y = myfunc(param)
C = param.C;
L = param.L;
Kp = param.Kp;
Ki = param.Ki;
...

Есть ли способ обобщить приведенный выше код? Я знаю, как обобщить структуру доступа, используя fieldnames() и getfield(), но не знаю, как устанавливать переменные без вызова eval() (что является злом).

for n = fieldnames(param)'
  name = n{1};
  value = param.(name);
  do_something_with(name,value);   % ????

Ответы [ 4 ]

5 голосов
/ 12 марта 2012

не бери в голову, я понял это;эта вспомогательная функция работает:

function vars_pull(s)
    for n = fieldnames(s)'
        name = n{1};
        value = s.(name);
        assignin('caller',name,value);
    end
2 голосов
/ 12 марта 2012

Единственный способ создать переменную, имя которой определяется во время выполнения, - это использовать такие функции, как eval, evalin, feval или assignin. (assignin - наименее злой выбор, кстати, по крайней мере, вам не нужно преобразовывать свое значение в строку и обратно.)

Однако я спрашиваю, почему вы хотите это сделать, а не просто получить доступ к значениям через структуру ввода, как вам нужно. Если вы хотите сохранить набор текста (судя по опыту, потому что я очень ленивый), я обычно называю структуру входных параметров чем-то коротким, например p. Во всем коде я просто обращаюсь к полям напрямую (например, p.Kp, и через некоторое время я даже не вижу p.). Это также позволяет легко передавать структуру в подфункции по мере необходимости.

1 голос
/ 12 марта 2012

Вы можете использовать отличную отправку в FileExchange:

V2STRUCT - Упаковать и распаковать переменные в и из структур с расширенными функциональными возможностями

0 голосов
/ 07 февраля 2015

Вот обходной путь: сохраните структуру в файл .mat с помощью опции '-struct', а затем немедленно перезагрузите ее.Вот пример для структурной переменной X:

save('deleteme.mat','-struct','X');
load('deleteme.mat');
delete('deleteme.mat');

Это хитро, но на самом деле довольно быстро, по крайней мере, с SSD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...