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

我想要做这样的事情:

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

所以当我说:

 >> foo() 

它会执行functionCall1()然后执行functionCall2() 。 (我觉得我需要像C这样的操作符 )

编辑:

functionCall1functionCall2不一定是返回值的函数。

试图通过命令行来做所有的事情,而不是在m文件中保存function可能是一个复杂的和凌乱的努力,但这是我提出的一个方法…

首先,使你的匿名函数 ,把他们的句柄在一个单元格数组 :

 fcn1 = @() ...; fcn2 = @() ...; fcn3 = @() ...; fcnArray = {fcn1 fcn2 fcn3}; 

…或者,如果你已经定义了函数(比如在m文件中),把函数句柄放在一个单元格数组中,如下所示:

 fcnArray = {@fcn1 @fcn2 @fcn3}; 

然后你可以创build一个新的匿名函数,使用内build的函数cellfunfeval调用数组中的每个函数:

 foo = @() cellfun(@feval,fcnArray); 

虽然有趣,但它的作品。

编辑:如果fcnArray的函数需要用input参数调用,您首先必须确保数组中的所有函数都需要相同的input数量。 在这种情况下,以下示例显示如何使用一个input参数分别调用函数数组:

 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的文档声明输出元素的计算顺序没有被指定,不应该被依赖。 这意味着不能保证fcn1fcn2fcn3之前得到评估。 如果订单重要,则不应使用上述解决scheme。

Matlab中的匿名函数语法(就像其他语言一样)只允许一个expression式。 此外,它具有不同的variables绑定语义(variables不在参数列表中,它们的在函数创build时在词汇上是绑定的,而不是绑定的引用)。 这种简单性使得Mathworks可以在幕后进行一些优化,并避免在脚本中使用它们时避免大量混乱的范围和对象生存期问题。

如果你在一个函数(不是脚本)中定义了这个匿名函数,你可以创build一个名为inner的函数。 内部函数具有普通的词法引用绑定,并允许任意数量的语句。

 function F = createfcn(a,...) F = @myfunc; function b = myfunc(...) a = a+1; b = a; end end 

有时候,你可以用像gnovice的build议这样的技巧逃脱。

注意使用eval …这是非常低效的(它绕过JIT),而Matlab的优化器可能会在evalexpression式中使用的外部作用域的variables和函数之间混淆。 debugging和/或扩展使用eval的代码也很困难。

这是一个保证执行顺序的方法,(最后提到的修改)允许将不同的parameter passing给不同的函数。

 call1 = @(a,b) a(); call12 = @(a,b) call1(b,call1(a,b)); 

关键是call1 ,它调用它的第一个参数,忽略第二个参数。 call12调用它的第一个参数,然后第二个参数,从第二个参数返回值。 它的工作原理是因为函数不能在它的参数之前被求值。 要创build你的例子,你会写:

 foo = @() call12(functionCall1, functionCall2); 

testing代码

这是我使用的testing代码:

 >> print1=@()fprintf('1\n'); >> print2=@()fprintf('2\n'); >> call12(print1,print2) 1 2 

调用更多的function

要调用3个函数,你可以写

 call1(print3, call1(print2, call1(print1,print2))); 

4个function:

 call1(print4, call1(print3, call1(print2, call1(print1,print2)))); 

有关更多function,请继续嵌套模式。

传递参数

如果你需要传递参数,你可以编写一个带参数的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版本,并根据需要进行混合和匹配。

如果functionCall1()functionCall2()返回一些东西,这些东西可以连接,那么你可以这样做:

>> foo = @() [functionCall1(), functionCall2()]

要么

>> foo = @() [functionCall1(); functionCall2()]

这样做的一个副作用就是foo()将返回任何functionCall1() call1 functionCall1()functionCall2()返回的串联。

我不知道是否保证了functionCall1()functionCall2()的执行顺序。

使用用来创build逗号分隔列表的curl函数是可能的。

 curly = @(x, varargin) x{varargin{:}}; f=@(x)curly({exp(x),log(x)}) [a,b]=f(2) 

也许我错过了一些有趣的东西,只是做一个函数combinationCall来调用这两个函数。