2010-03-19 33 views
5

Varargin'i girişleri olarak alan bir işleve sarıcı yazıyorum. Sarıcıdaki işlev imzasını korumak istiyorum, ancak varargin numaralı yuvada tüm değişkenlerin birlikte toplanmasına neden oluyor. Ben bireysel değişkenlerin bir listesi var kiTek tek değişkenlere varargin paketinin açılması

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 

Ben, dış fonksiyonunda varargin açmak için bir yol gerekir. inner geçmek ve eval çağırmak için değişkenlerin adlarının bir dize inşa ederek bunu yapmak için gerçekten kötü bir yol yoktur.

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 

kimse, şeyler yapmanın daha az iğrenç bir şekilde lütfen düşünebiliyor musunuz?

cevap

10

dış iç çağrı yerine başka bir deyişle

inner(varargin{:}) 

olarak iç çağrısı virgülle ayrılmış liste halinde varargin genişletmelidir. O zaman tüm pisliği önleyebilirsiniz.

+0

Teşekkürler, bu çok zarif. –

+0

Merak etme, dizileri ayırmanın eşdeğer bir yolu var mı? C = arrayfun'un daha hoş bir versiyonu gibi (@ (x) x, 1: 3, 'UniformOutput', false); c {:} '. –

+0

Daha güzel olduğundan emin değilsiniz, ancak belki de cell2mat'ın varyantlarını kullanabilirsiniz. Arrayfun ile ilgili ne, şifreli mi? Çıktının ön kaydını açarsanız bir for döngüsü de kullanabilirsiniz. Performansın makul boyuttaki diziler için büyük bir sorun olacağını düşünmüyorum. – Loren

İlgili konular