24

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

sqr = @(x) x.^2;

我想要一个简单的匿名函数,它可以返回多个输出,如下所示。. .

[b,a] = myAnonymousFunc(x);

Matlab 文档表明这是可能的,但它没有给出定义此类函数所需的语法示例。

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

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

4

3 回答 3

28

这能满足您的需要吗?

>> 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
于 2012-05-17T11:13:31.827 回答
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

于 2014-12-17T01:08:15.750 回答
7

如果被调用的函数返回多个输出,则可以从匿名函数获得多个输出。有关此操作的示例,请参阅 MathWorks 网站上的此博客文章。

有两种方法可以从匿名函数中获取多个输出:

  • 调用返回多个输出的函数

    从链接到的博客文章中,他们使用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
于 2012-05-17T11:13:34.370 回答