11

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

   [a b] = foo(c ).

如果我考虑一个函数句柄

 f = @(c)foo(c)

例如在cellfun通话中使用,我得到的是与定义类似的f行为foo

  a = foo(c)

即,返回的值b会丢失。

因此,当这样一个fcellfun调用时,输出单元格将只有as 并且会错过bs (我目前关心的)。视觉上

    cellfun(f,input)

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

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

  b = foo(c)

即 ^2,浪费as。

此外,是否有可能(有效地)在一个独特的a电话中同时捕捉到两者?b cellfun

4

2 回答 2

7

从以下文档cellfun

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

所以是的,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
于 2012-11-21T10:45:23.433 回答
2

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

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

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}
于 2015-09-15T16:20:27.567 回答