3 回答

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
嘗試通過(guò)命令行執(zhí)行所有操作而不在m文件中保存函數(shù)可能是一項(xiàng)復(fù)雜而混亂的工作,但這是我想出的一種方法...
首先,創(chuàng)建您的匿名函數(shù)并將其句柄放入單元格數(shù)組中:
fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};
...或者,如果您已經(jīng)定義了函數(shù)(例如在m文件中),則將函數(shù)句柄放置在像這樣的單元格數(shù)組中:
fcnArray = {@fcn1 @fcn2 @fcn3};
然后,您可以創(chuàng)建一個(gè)新的匿名函數(shù),該函數(shù)使用內(nèi)置函數(shù)cellfun和調(diào)用數(shù)組中的每個(gè)函數(shù)feval:
foo = @() cellfun(@feval,fcnArray);
盡管看起來(lái)很有趣,但它確實(shí)有效。
編輯:如果fcnArray需要使用輸入?yún)?shù)來(lái)調(diào)用函數(shù),則首先必須確保數(shù)組中的所有函數(shù)都需要輸入數(shù)量相同。在這種情況下,下面的示例演示如何使用每個(gè)輸入?yún)?shù)調(diào)用函數(shù)數(shù)組:
foo = @(x) cellfun(@feval,fcnArray,x);
inArgs = {1 'a' [1 2 3]};
foo(inArgs); %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3
警告詞:有關(guān)cellfun狀態(tài)文檔,說(shuō)明未指定并且不應(yīng)依賴輸出元素的計(jì)算順序。這意味著沒(méi)有保證fcn1可以在fcn2或之前得到評(píng)估fcn3。如果訂單很重要,則不應(yīng)使用上述解決方案。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
Matlab中的匿名函數(shù)語(yǔ)法(像某些其他語(yǔ)言一樣)僅允許單個(gè)表達(dá)式。此外,它具有不同的變量綁定語(yǔ)義(不在參數(shù)列表中的變量在函數(shù)創(chuàng)建時(shí)具有按詞法綁定的值,而不是綁定引用)。這種簡(jiǎn)單性使Mathworks可以在后臺(tái)進(jìn)行一些優(yōu)化,并避免在腳本中使用它們時(shí)出現(xiàn)許多混亂的作用域和對(duì)象生存期問(wèn)題。
如果要在函數(shù)(而不是腳本)中定義此匿名函數(shù),則可以創(chuàng)建命名的內(nèi)部函數(shù)。內(nèi)部函數(shù)具有正常的詞法引用綁定,并允許任意數(shù)量的語(yǔ)句。
function F = createfcn(a,...)
F = @myfunc;
function b = myfunc(...)
a = a+1;
b = a;
end
end
有時(shí),您可以擺脫gnovice的建議之類(lèi)的技巧。
在使用eval時(shí)要特別小心……它效率極低(它繞過(guò)JIT),Matlab的優(yōu)化程序可能會(huì)混淆eval表達(dá)式內(nèi)部使用的外部作用域中的變量和函數(shù)。調(diào)試和/或擴(kuò)展使用eval的代碼也很困難。

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是一種保證執(zhí)行順序的方法,并且(在最后提到了修改)允許將不同的參數(shù)傳遞給不同的函數(shù)。
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
關(guān)鍵是call1調(diào)用第一個(gè)參數(shù)而忽略第二個(gè)參數(shù)。call12調(diào)用其第一個(gè)參數(shù),然后調(diào)用第二個(gè)參數(shù),并從第二個(gè)參數(shù)返回值。之所以起作用,是因?yàn)闊o(wú)法在函數(shù)的參數(shù)之前對(duì)其求值。要?jiǎng)?chuàng)建您的示例,您應(yīng)編寫(xiě):
foo = @() call12(functionCall1, functionCall2);
測(cè)試代碼
這是我使用的測(cè)試代碼:
>> print1=@()fprintf('1\n');
>> print2=@()fprintf('2\n');
>> call12(print1,print2)
1
2
調(diào)用更多功能
要調(diào)用3個(gè)函數(shù),您可以編寫(xiě)
call1(print3, call1(print2, call1(print1,print2)));
4個(gè)功能:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
有關(guān)更多功能,請(qǐng)繼續(xù)嵌套模式。
傳遞參數(shù)
如果您需要傳遞參數(shù),則可以編寫(xiě)一個(gè)帶有參數(shù)的版本,call1然后對(duì)進(jìn)行明顯的修改call12。
call1arg1 = @(a,arg_a,b) a(arg_a);
call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))
您還可以制作帶有多個(gè)參數(shù)的call1版本,并根據(jù)需要對(duì)其進(jìn)行混合和匹配。
- 3 回答
- 0 關(guān)注
- 1293 瀏覽
添加回答
舉報(bào)