Matlab:定义一个函数句柄,捕获函数的第二个返回值



假设我有一个函数foo定义为

   [a b] = foo(c ).

如果我考虑函数句柄

 f = @(c)foo(c)

例如在cellfun调用中使用,我得到的是一个行为等同于定义如下foof

  a = foo(c)

即,返回值b丢失。

因此,当这样的f放入cellfun调用时,输出单元将只有a s,并且会错过b s(我目前关心的)。视觉

    cellfun(f,input)
  [a(input{1})]           ?
  [a(input{2})]           ?
     ....            b gets killed along the way

问题:如何定义一个函数句柄来foo捕获b s?即给出类似于foo定义

的行为,例如
  b = foo(c)

即^2,浪费a s。

此外,是否有可能(有效地)在独特的cellfun调用中捕获ab

> 来自cellfun的文档:

[A1,...,Am] = cellfun(func,C1,...,Cn) 调用函数句柄 func 指定的函数,并从单元格数组 C1,...,Cn 传递元素,其中 n 是函数函数函数的输入数。输出数组 A1,...,Am,其中 m 是函数函数的输出数,包含函数调用的组合输出。

所以是的,cellfun可以使用多输出函数,在这种情况下,它只是返回许多输出。如果只想使用第二个,则可以使用 ~ 忽略第一个。匿名函数的多个输出也是如此 - 如果您指定多个输出参数,它们将被返回。下面是一个简单的代码:

function test
    x{1} = 1;
    x{2} = 2;
    [~, B] = cellfun(@foo, x);
    f=@(c)foo(c);
    [A, B] = f(1);
    function [a b] = foo(x)
        a = x+1;
        b = x+2;
    end
end

这可以通过使用单元格数组作为函数的单个输出来完成,而不是具有多个输出的函数。

定义函数以返回单元数组(或创建调用原始多输出函数的辅助函数):

function F = foo2(x)
  [a,b,c] = foo(x);
  F = {a, b, c};
end

然后,您可以创建一个句柄来调用您的函数,并且仅从单元格数组中获取其中一个单元格。

f = @(x) cell(foo2(x)){2} % This selects the second output
g = @(x) cell(foo2(x)){3} % This selects the third output

这几乎正是您所要求的。您甚至可以创建一个返回第 n 个输出的句柄

f = @(x,n) cell(foo2(x)){n}

最新更新