2013-08-05 38 views
1

我有這個功能,我想爲所有的輸入和輸出使用varargin和varargout,我不知道如何去做。使用varargin和varargout編寫函數

有什麼建議嗎?這是我的函數:

function [Output0,Output1] = myfunction(p0,p1,normal0,normal1,c0,c1) 

t0 = sqrt((c0^2)/((normal0(1)^2) + (normal0(2)^2) + (normal0(3)^2))); 
Output0= p0 + normal0*t0; 

t1 = sqrt((c1^2)/((normal1(1)^2) + (normal1(2)^2) + (normal1(3)^2))); 
Output1= p1 + normal1*t1; 

在此先感謝

+0

你確定要'varargin'嗎?這可以讓你任意數量的輸入。看起來你有一個可定義的輸入數量,所以你可能會發現使用'nargin'更合適。或者你只是想讓它處理'n'尺寸,然後是矢量化。你可以不用x0和x1而只用'X'或者代替'x0','y0'和'z0'來代替x0,y0和z0,而只需要'P0' ... – Dan

+0

。但是對於x1,y1和z1也是如此。但我想要的是使輸入和輸出變量,所以我可以使用它與另一個變量,因爲我有兩個函數完全相同,但具有不同的變量輸入和輸出名稱。 –

+1

@ Jack_111它有什麼好處?參數(即在函數定義中)和參數(即在調用中)的變量名彼此獨立。如果你的變量是以這種方式命名的,你可以用'[o1,o2] = myfunction(foo0,foo1,no0,no1,c00,c01)''愉快地調用這個函數。 – glglgl

回答

3

我不認爲這是varargin或者甚至nargin適當的情況下。這是一個向量化你的函數的例子。 OK,讓我們假設你有這些輸入:xo,yo,zo,x1,y1,z1(所有標量),normal0(1x3),normal1(1x3)以及c0和c1都是標量。

讓我們看看我們是否可以矢量化您的函數來計算一次拍攝中的所有輸出。所以首先我們會重新安排你的數據:

P = [x0, x1; 
    y0, y1 
    z0, z1]; 

N = [normal0; 
    normal1]'; %better here to just make normal0 a (3x1) so no need to transpose 

C = [c0, c1] 

現在讓我們來看看你怎樣得到你的第一個輸出:

t0 = sqrt((c0^2)/((normal0(1)^2) + (normal0(2)^2) + (normal0(3)^2))); 
Output0= p0 + normal0*t0; 

這可以簡化爲

p0 + normal0 * sqrt(c0^2/sum(normal0.^2)) 

可以概括到

P + bsxfun(@times,N,sqrt(bsxfun(@rdivide,C.^2,sum(N.^2)))) 

所以現在你可以一次性獲得任意數量的輸出!也在一行中!

只是快速解釋bsxfun進入它的位置。所以在你的原始計算中,你有時會將一個標量乘以或添加到一個向量中。 Matlab允許這樣做,但它不允許向2D矩陣中添加矢量的高維情況。 bsxfun爲我們做到了這一點。所以在上面我有bsxfun(@times, N, B)時,它只需要3x1 B矢量,並在3x2 N的每列上執行B的元素乘法(@times.*的函數句柄)。但是,這裏N可以是3xX,即具有任意數量的列即任意數量的輸入。