通缉:一个匿名函数返回1个以上输出的Matlab示例

时间:2012-05-17 11:04:03

标签: function matlab arguments anonymous-function

我使用匿名函数进行简单的数据值转换。匿名函数使用以下语法定义

sqr = @(x) x.^2;

我想有一个简单的匿名函数,它返回多个输出,可以按如下方式使用。 。

[b,a] = myAnonymousFunc(x);

Matlab文档表明这是可能的,但它没有给出定义这样一个函数所需语法的例子。

http://www.mathworks.co.uk/help/techdoc/matlab_prog/f4-70115.html#f4-71162

定义这样一个函数[在一行中的语法是什么,比如帖子顶部的代码示例]是什么语法?

3 个答案:

答案 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