2

我一定错过了一些非常简单的东西,因为这看起来不应该这么难。

这段代码是正确的:

clear all
whatever = @(x) deal(max(x), size(x));
input = randn(1,1000);
[a b] = whatever(input) 

但是,我真正想做的是这样的:

clear all
whatever = @(x) deal(q = 3; q*max(x), size(x));
input = randn(1,1000);
[a b] = whatever(input)    

为什么会中断?我不能在函数内部定义 q ??我想使用匿名函数的全部原因是我实际上可以在其中执行多行代码,然后返回答案。我想匿名函数的最后一条语句是返回的,但是如何在其中定义变量呢?我不想在定义匿名函数之前定义 q 。

谢谢。

4

4 回答 4

5

您不能在匿名函数中声明变量,因为它必须由表达式构造,handle = @(arglist)expr

如果您想要可读性,请q在函数外部定义,如下所示:

q = 3;
whatever = @(x) deal(q * max(x), size(x));
于 2012-09-01T16:34:48.067 回答
2

你没有。匿名函数只有一个语句。您为此使用子函数(不是嵌套函数,这些是具有奇怪范围规则的病态)。

function whatever = not_anonymous (x)
  % your code here
end

如果你需要传递函数句柄,你可以使用@not_anonymous.

于 2012-09-01T16:34:38.967 回答
2

您如何看待以下构造:

tmpfun = @(x,q) deal...
whatever = @(x) tmpfun(x,3)
于 2012-09-01T19:11:13.393 回答
1

我很确定 deal 不能接受多个命令。多个参数,当然,但你正在尝试传递命令。这行得通吗?

whatever = @(x) q=3; deal(q*max(x), size(x));

还有,你为什么不吃这个?

whatever = @(x) deal(3*max(x), size(x));

如果你要在函数中定义它,你最好把实际值放在那里,如果你不能让其他任何东西起作用。

于 2012-09-01T16:29:26.493 回答