Estoy escribiendo un contenedor para una función que toma varargin como sus entradas. Deseo conservar la firma de la función en el contenedor, pero al anidar varargin
se agrupan todas las variables.Desempaquetar varargin a variables individuales
function inner(varargin) %#ok<VANUS>
% An existing function
disp(nargin)
end
function outer(varargin)
% My wrapper
inner(varargin);
end
outer('foo', 1:3, {}) % Uh-oh, this is 1
necesito una manera de descomprimir varargin
en la función externa, por lo que tengo una lista de variables individuales. Hay una forma realmente desagradable de hacer esto al construir una cadena de nombres de las variables para pasar el inner
y llamar al eval
.
function outer2(varargin) %#ok<VANUS>
% My wrapper, second attempt
inputstr = '';
for i = 1:nargin
inputstr = [inputstr 'varargin{' num2str(i) '}']; %#ok<AGROW>
if i < nargin
inputstr = [inputstr ', ']; %#ok<AGROW>
end
end
eval(['inner(' inputstr ')']);
end
outer2('foo', 1:3, {}) % 3, as it should be
¿Alguien puede pensar en una manera menos horrible de hacer las cosas, por favor?
Gracias, eso es muy elegante. –
Por curiosidad, ¿existe una forma equivalente de dividir matrices? Como una versión más agradable de 'c = arrayfun (@ (x) x, 1: 3, 'UniformOutput', falso); c {:} '. –
No estoy seguro de que sea mejor, pero puede usar variantes de cell2mat quizás. ¿Cuál es el problema con arrayfun, críptico? También puede usar un ciclo for para preasignar la salida. No creo que el rendimiento sea un gran problema para las matrices de tamaño razonable. – Loren