我使用匿名函数进行简单的数据值转换。匿名函数使用以下语法定义
sqr = @(x) x.^2;
我想有一个简单的匿名函数,它返回多个输出,可以按如下方式使用。 。
[b,a] = myAnonymousFunc(x);
Matlab文档表明这是可能的,但它没有给出定义这样一个函数所需语法的例子。
http://www.mathworks.co.uk/help/techdoc/matlab_prog/f4-70115.html#f4-71162
定义这样一个函数[在一行中的语法是什么,比如帖子顶部的代码示例]是什么语法?
答案 0 :(得分:26)
这可以满足您的需求吗?
>> f = @(x)deal(x.^2,x.^3);
>> [a,b]=f(3)
a =
9
b =
27
使用此示例,您需要确保仅使用两个输出参数调用f
,否则将出错。
修改强>
至少在最新版本的MATLAB中,您只能使用~
语法返回一些输出参数:
>> [a,~]=f(3)
a =
9
>> [~,b]=f(3)
b =
27
答案 1 :(得分:8)
如果您不想使用tilde~跳过输出也不输出单元格数组,那么您只需要一个辅助匿名函数:
deal2 = @(varargin) deal(varargin{1:nargout});
myAnonymousFunc = @(x) deal2(x.^2, x.^3);
然后你可以只获得第一个输出参数或第一个和第二个参数:
x = 2;
[b,a] = myAnonymousFunc(x)
b = myAnonymousFunc(x)
结果:
b = 4
a = 8
b = 4
答案 2 :(得分:7)
如果被调用的函数返回多个输出,则可以从匿名函数获取多个输出。有关此操作的示例,请参见MathWorks网站上的blog post。
有两种方法可以从匿名函数中获取多个输出:
调用返回多个输出的函数
在链接到的博文中,他们使用eig
函数,如此
fdoubleEig = @(x) eig(2*x)
[e, v] = fdoubleEig(magic(3))
或者,您可以使用deal
函数构造一个返回多个输出的匿名函数。
这是我编写的一个:
>>> f = @(x, y, z) deal(2*x, 3*y, 4*z)
>>> [a, b, c] = f(1, 2, 3)
a =
2
b =
6
c =
12
编辑:正如Sam Roberts所述,在我链接到的博客文章中,使用deal
时必须使用正确数量的输出参数,否则会引发错误。解决此问题的一种方法是返回结果单元格。例如
>>> f = @(x, y, z) {2*x, 3*y, 4*z}
>>> t = f(1, 2, 3)
>>> [a, b, c] = t{:}
a =
2
b =
6
c =
12