3 回答

TA貢獻2039條經驗 獲得超8個贊
嘗試通過命令行執行所有操作而不在m文件中保存函數可能是一項復雜而混亂的工作,但這是我想出的一種方法...
首先,創建您的匿名函數并將其句柄放入單元格數組中:
fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};
...或者,如果您已經定義了函數(例如在m文件中),則將函數句柄放置在像這樣的單元格數組中:
fcnArray = {@fcn1 @fcn2 @fcn3};
然后,您可以創建一個新的匿名函數,該函數使用內置函數cellfun和調用數組中的每個函數feval:
foo = @() cellfun(@feval,fcnArray);
盡管看起來很有趣,但它確實有效。
編輯:如果fcnArray需要使用輸入參數來調用函數,則首先必須確保數組中的所有函數都需要輸入數量相同。在這種情況下,下面的示例演示如何使用每個輸入參數調用函數數組:
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
警告詞:有關cellfun狀態文檔,說明未指定并且不應依賴輸出元素的計算順序。這意味著沒有保證fcn1可以在fcn2或之前得到評估fcn3。如果訂單很重要,則不應使用上述解決方案。

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

TA貢獻1813條經驗 獲得超2個贊
這是一種保證執行順序的方法,并且(在最后提到了修改)允許將不同的參數傳遞給不同的函數。
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
關鍵是call1調用第一個參數而忽略第二個參數。call12調用其第一個參數,然后調用第二個參數,并從第二個參數返回值。之所以起作用,是因為無法在函數的參數之前對其求值。要創建您的示例,您應編寫:
foo = @() call12(functionCall1, functionCall2);
測試代碼
這是我使用的測試代碼:
>> print1=@()fprintf('1\n');
>> print2=@()fprintf('2\n');
>> call12(print1,print2)
1
2
調用更多功能
要調用3個函數,您可以編寫
call1(print3, call1(print2, call1(print1,print2)));
4個功能:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
有關更多功能,請繼續嵌套模式。
傳遞參數
如果您需要傳遞參數,則可以編寫一個帶有參數的版本,call1然后對進行明顯的修改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))
您還可以制作帶有多個參數的call1版本,并根據需要對其進行混合和匹配。
- 3 回答
- 0 關注
- 1304 瀏覽
添加回答
舉報