2010-03-19 15 views
5

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?

Respuesta

10

La llamada en interior en exterior debería ser en cambio

inner(varargin{:}) 

En otras palabras, ampliar varargin en la lista separada por comas para que la llamada interna. Entonces puedes evitar todo el desastre.

+0

Gracias, eso es muy elegante. –

+0

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 {:} '. –

+0

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

Cuestiones relacionadas