我看到一個函數傳遞像傳遞函數作爲參數另一個函數
sigma = 3*e-2
svmTrain(...,@(X,y)gaussianKernel(X,y,sigma),...);
這是怎麼回事有這樣的功能傳球,會有人解釋一下嗎?
我看到一個函數傳遞像傳遞函數作爲參數另一個函數
sigma = 3*e-2
svmTrain(...,@(X,y)gaussianKernel(X,y,sigma),...);
這是怎麼回事有這樣的功能傳球,會有人解釋一下嗎?
語法@(X,y) gaussianKernel(X, y, sigma)
通過將此現有函數guassianKernel(X, y, s)
的第三個參數綁定爲具體值sigma
來創建anonymous function。
如果您檢查svmTrain
函數簽名,您會看到它允許傳入函數,這是匿名函數的作用。
這裏發生了兩件事:
首先是函數傳遞。例如,您的代碼中有一個函數foo
,並且您想將其作爲參數傳遞。在這種情況下,您使用@
運算符。
function MainScript
goo(@foo);
end
function goo(fHandle)
fHandle();
end
function foo
disp('Hello world!');
end
第二個是匿名函數。匿名函數的功能與其他函數非常相似,除了它在運行時定義,它沒有名稱,並且它本身綁定了傳遞給它的變量的本地副本。 (有關更多信息,請參見Closure)。例如:
function MainScript
foo = @() (disp('Hello world!'));
goo(@foo);
end
因此,第三個參數是靜態綁定的而Xy是在運行時綁定的? – erogol
第三個參數是一個常量,是的。如果您熟悉Python中的「partial」(或功能計算中的類似物),那就是這樣。其他參數可以在'svmTrain'過程中自由傳入和評估。所以就像你得到一個新的幻像函數,它有兩個參數而不是三個,但是其他的一切都和以前一樣,一直使用第三個參數的傳入常量。 – ely