为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2019-12-02 10:47:13
我想做这样的事情:>> foo = @() functionCall1() functionCall2()所以当我说:>> foo()它先执行functionCall1()然后执行functionCall2()。(我觉得我需要类似C的运算符)编辑:functionCall1并且functionCall2不一定是返回值的函数。
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-12-02
?
慕神8447489

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的代码也很困难。


查看完整回答
反对 回复 2019-12-02
?
慕姐8265434

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版本,并根据需要对其进行混合和匹配。


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 1056 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信