Аргументы MATLAB переменной длины, считанные из переменной - PullRequest
3 голосов
/ 15 июля 2009

У меня есть функция с переменными аргументами, объявленными стандартным способом:

[] = foo ( varargin )

и я хотел бы вызвать его из другой функции, но указать аргументы программно. Моя лучшая попытка выглядит примерно так:

% bar isn't populated like this, but this is how it ends up
bar = { 'var1' 'var2' 'var3' }; 
foo( bar );

Однако bar помещается в массив ячеек 1x1 и не интерпретируется как массив ячеек 1x3, как я планировал. Я не могу изменить foo, есть ли обходной путь?

Ответы [ 2 ]

10 голосов
/ 15 июля 2009

Если у вас есть переменные a, b и c, которые вы хотите где-то собрать и в конечном итоге передать функции в виде последовательности входных данных, вы можете сделать следующее:

inArgs = {a b c};  % Put values in a cell array
foo(inArgs{:});

Синтаксис inArgs{:} извлекает все значения из массива ячеек в виде списка, разделенного запятыми . Поэтому вышесказанное эквивалентно этому:

foo(a,b,c);

Если записано foo для приема списка аргументов переменной длины , то переменная varargin в конечном итоге станет массивом ячейки 1 на 3, где каждый элемент хранит отдельный входной аргумент , По сути, varargin будет выглядеть точно как переменная inArgs. Если при вашем звонке на foo оператор {:} не использовался:

foo(inArgs);

тогда переменная varargin будет массивом ячеек 1 на 1, где первым элементом является сам массив ячеек inArgs. Другими словами, foo будет иметь только 1 вход (массив ячеек 1 на 3).

0 голосов
/ 15 июля 2009

Единственный известный мне способ - использовать eval, однако у меня нет MATLAB, поэтому я не могу правильно проверить синтаксис.

Если вы преобразуете строку в строку вида "'var1', 'var2', 'var3'", вы можете сделать:

eval(["foo(", barString, ")"])

Надеюсь, что это поможет вам, и извините, что это не исчерпывающий ответ.

...