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

lea*_*vst 23 matlab arguments function anonymous-function

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

sqr = @(x) x.^2;
Run Code Online (Sandbox Code Playgroud)

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

[b,a] = myAnonymousFunc(x);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*rts 26

这样做你需要的吗?

>> f = @(x)deal(x.^2,x.^3);
>> [a,b]=f(3)
a =
     9
b =
    27
Run Code Online (Sandbox Code Playgroud)

在这个例子中,您需要确保只f使用两个输出参数进行调用,否则会出错.

编辑

至少在最新版本的MATLAB中,您只能使用以下~语法返回一些输出参数:

>> [a,~]=f(3)
a =
     9
>> [~,b]=f(3)
b =
    27
Run Code Online (Sandbox Code Playgroud)


Fel*_*ski 8

如果你不想使用tilde~跳过输出也不输出单元格数组,你只需要一个辅助匿名函数:

 deal2 = @(varargin) deal(varargin{1:nargout});
 myAnonymousFunc = @(x) deal2(x.^2, x.^3);
Run Code Online (Sandbox Code Playgroud)

那么你可以只获得第一个输出参数或第一个和第二个参数:

x = 2;
[b,a] = myAnonymousFunc(x)
b = myAnonymousFunc(x)
Run Code Online (Sandbox Code Playgroud)

结果:

b = 4

a = 8

b = 4


Chr*_*ris 7

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

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

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

    从链接到的博客文章中,他们使用了eig这样的功能

    fdoubleEig = @(x) eig(2*x)
    [e, v] = fdoubleEig(magic(3))
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者,您可以构造一个匿名函数,该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
    
    Run Code Online (Sandbox Code Playgroud)

编辑:正如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
Run Code Online (Sandbox Code Playgroud)