2011-02-04 12 views
30

mini örnek:Varargin ve varargout kullanarak bir işlev nasıl sarılır?

function varargout = wrapper(varargin) 
varargout = someFunction(varargin); 

Bu haberi ilk yapardım nasıl. Ancak, örneğin, someFunction = ndgrid bu, hücre dizileri hatası için tanımlanmamışsa, bir sonraki deneme yerine someFunction(varargin{:}) kullanıyordu. Bu başarılı bir çağrıdır, ancak [a,b] = wrapper([1,2], [3,4]) numaralı telefonu arayarak ndgrid numaralı telefona doğrudan bir çağrı gelmiyor, ne yapıyorum? Çıktı argümanların sayısı giriş parametrelerinin sayısının aynıysa

cevap

35

Aslında, Mikhail'in cevabı pek doğru değil. Bazı fonksiyonların, hiçbiri istenmediyse bile bir değer döndüren bir fonksiyon olması durumunda, bir fonksiyonun değerin ans olarak atanması gerektiğini ifade etmesi durumunda, Mikhail'in ambalajı başarısız olacaktır. birFonksiyon günah ile değiştirilmiştir ve doğrudan günahı çalıştıran karşı sarmalayıcı çalışan karşılaştırıldığında Örneğin, göreceğiniz:

>> wrapper(0) 
>> sin(0) 

ans = 

    0 

Bunu yapmanın doğru yolu bu işleri nedeni

function varargout = wrapper(varargin) 
[varargout{1:nargout}] = someFunction(varargin{:}); 

olduğunu MATLAB endeksleme kurallarındaki az bilinen bir durum nedeniyle, bu durum için en azından R2006a (muhtemelen daha uzun) olduğundan tam olarak var. MATLAB indekslemede bir siğildir ama bu tür şeylerin üstesinden gelmek için gerekli görülmüştür.

kural şudur:

eğer indisli atama yaparken

  • -subscripted atama başlatılmamış değişkene VE
  • başlatılmamış değişken kıvırcık bağ endeksli olduğunu, VE
  • küme parantezindeki dizin boş, VE
  • sol taraf köşeli parantez içinde görünür ve
  • sağ taraf/bir değere giderir

sonra başlatılmamış değişken sağ taraftaki tarafından döndürülen bir değer içeren bir skaler hücre atanan bir çıkış verir. Örneğin

:

>> clear uninit % just to make sure uninit is uninitialized 
>> [uninit{[]}] = sin(0) 

uninit = 

    [0] 
+1

+1 vermez ve bu derin içgörülere teşekkürler! Yukarıdaki kuralları nereden aldınız? – Mikhail

+7

Eh, dürüst olmak gerekirse, kaynak koduna erişiminiz varsa yardımcı olur ... Ben MathWorks için çalışıyorum. Bunun resmi olarak herhangi bir yerde belgelenmiş olup olmadığından emin değilim. Gelişmiş kullanıcıya yardımcı olan, ancak yeni başlayanları kolayca tamamen karıştıran şeylerden biri. Ancak, bu davranışın değişmeyeceğinden eminim çünkü bu davayı ele almak için gerekli. – SCFrench

+0

Paylaştığınız için teşekkürler, bu beni uzun zamandır dile getirdi! – Erik

6
function varargout = wrapper(varargin) 

if ~nargout 
    someFunction(varargin{:}); 
else 
    [varargout{1:nargout}] = someFunction(varargin{:}); 
end 
+0

Oh, 30 saniye beni alt :) Ben tam aynı cevabı vardı. – Edric

1

, sen

function varargout = wrapper(varargin) 
[varargout{1:nargin}] = someFunction(varargin{:}); 

kullanabilirsiniz Bu ndgrid ile çalışıyor.

+2

Yazım hatası dışında (kesinlikle varargout {1: nargout} anlamına gelir), bu yaklaşımın her zaman çıkışını verdiğini unutmayın - bu nedenle Mikhail'in ekstra "~ nargout" koruması. – Edric

+0

@Edric: 'Nargin'i kullanarak amacım' nargile = nargin 'varsayımı nedeniyle amaçlanmıştı. Bu durumda '~ nargile' koruyucusu gerekli değildir –

+1

@Edric ... ayrıca [SCFrench'in cevabı] 'na bakın (http://stackoverflow.com/questions/4895556/how-to-wrap-a-function-using- varargin-and-varargout/4910926 # 4910926) neden bekçi istenen davranışı –

İlgili konular