Matlab:没有匿名函数输出的调用函数

时间:2014-12-02 14:43:12

标签: matlab lambda

我想在匿名函数中调用某个函数,如

@(){fooBar(baz)}

麻烦的是,fooBar没有输出,这使得匿名函数抱怨。除了使fooBar函数返回虚拟输出之外,有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:5)

问题在于您的匿名函数定义。通过将函数foobar(baz)括在字符{...}之间,您正在编写一个函数,该函数必须:

  • 评估表达式foobar(baz)
  • 将此表达式的结果放入cell
  • 返回单元格

显然在步骤(2)中,Matlab不能将表达式(1)的结果放在单元格中,因为(1)没有输出。

所以只需在没有大括号的情况下定义你的函数:

myFunction = @() fooBar(baz)

一切都应该正常。


为了演示一个例子,让我们通过做一些不产生输出的东西来定义函数fooBar(例如改变斧头限制):

fooBar = @(axlim) set(gca,'XLim',axlim) 

我现在可以调用fooBar([0 20]),当前轴将直接将其轴限制设置为[0 20]

如果我经常使用轴间距(例如[-5 5]),我可能会想要定义一个新函数,该函数将始终使用相同(常用)参数调用fooBar

fooBarPrefered = @() fooBar([-5 5])

现在每次拨打fooBarPrefered()时,我的X轴限制都会直接设置为[-5 5]。


为了进一步证明这一点,由于调用fooBar([-5 5])不会产生输出,如果我用花括号定义我的函数,Matlab确实会抱怨:

fooBarPrefered = @() {fooBar([-5 5])} ;
>> fooBarPrefered()
One or more output arguments not assigned during call to "set".
Error in @(axlim)set(gca,'XLim',axlim)

Error in @(){fooBar([-5,5])}

但请注意,这与您尝试将fooBar的输出直接分配给工作空间中的变量的错误相同:

a = fooBar([0 20])
One or more output arguments not assigned during call to "set".
Error in @(axlim)set(gca,'XLim',axlim)

底线:如果某个函数没有输出,请不要尝试将此输出重定向到变量或表达式。