У меня была та же проблема, и я искал общее решение проблемы, что в скрипте аргументы передаются в виде строк, но нужны как скаляры или векторы.
Предположим, у вас есть следующая функция
function myfunc(arg1, arg2, varargs)
end
и, возможно, вы захотите назвать его как
myfunc(1, [1 2 3], 'optional1', 2)
а также как
myfunc('1', '[1 2 3]', 'optional1', '2')
, чтобы вы могли скомпилировать его и использовать в командной строке, например
myfunc 1 '[1 2 3]' optional1 2
Для этого я написал следующую функцию:
function r=evalArguments(parser, arguments)
% Evaluates parsed arguments' values.
% Given a parser containing parsed arguments, all string values of the
% arguments specified by parameter "arguments" are evaluated
% and the complete results is returned in a new struct.
r = parser.Results;
for j=1:length(arguments)
argValue = r.(arguments{j});
if ischar(argValue)
r.(arguments{j}) = eval(argValue);
end
end
end
Тогда я могу использовать inputParser в myfunc
следующим образом:
p = inputParser;
p.addRequired('arg1');
p.addRequired('arg2');
p.addParameter('optional1', 0);
p.parse(arg1, arg2, varargin{:});
nonStringArguments = {'arg1', 'arg2', 'optional1'};
args = evalArguments(p, nonStringArguments);
...
x = args.arg1;
y = args.arg2;
z = args.optional1;
Поскольку я не нашел готового способа сделать это, я публикую это решение здесь и надеюсь, что оно также может быть полезным для других.
Если есть лучший способ добиться этого, пожалуйста, дайте мне знать.