如何在MATLAB匿名函数中执行多个语句?

我想做这样的事情:


>> foo = @() functionCall1() functionCall2()

所以当我说:


>> foo()

它先执行functionCall1()然后执行functionCall2()。(我觉得我需要类似C的运算符)


编辑:


functionCall1并且functionCall2不一定是返回值的函数。


翻过高山走不出你
浏览 1067回答 3
3回答

largeQ

尝试通过命令行执行所有操作而不在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。如果订单很重要,则不应使用上述解决方案。

慕神8447489

Matlab中的匿名函数语法(像某些其他语言一样)仅允许单个表达式。此外,它具有不同的变量绑定语义(不在参数列表中的变量在函数创建时具有按词法绑定的值,而不是绑定引用)。这种简单性使Mathworks可以在后台进行一些优化,并避免在脚本中使用它们时出现许多混乱的作用域和对象生存期问题。如果要在函数(而不是脚本)中定义此匿名函数,则可以创建命名的内部函数。内部函数具有正常的词法引用绑定,并允许任意数量的语句。function F = createfcn(a,...)  F = @myfunc;  function b = myfunc(...)    a = a+1;     b = a;   endend有时,您可以摆脱gnovice的建议之类的技巧。在使用eval时要特别小心……它效率极低(它绕过JIT),Matlab的优化程序可能会混淆eval表达式内部使用的外部作用域中的变量和函数。调试和/或扩展使用eval的代码也很困难。

慕姐8265434

这是一种保证执行顺序的方法,并且(在最后提到了修改)允许将不同的参数传递给不同的函数。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)12调用更多功能要调用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版本,并根据需要对其进行混合和匹配。
打开App,查看更多内容
随时随地看视频慕课网APP