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?
Teşekkürler, bu çok zarif. –
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 {:} '. –
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