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

时间:2012-11-21 09:27:14

标签: matlab function-handle

假设我将函数foo定义为

   [a b] = foo(c ).

如果我考虑一个函数句柄

 f = @(c)foo(c)

用于例如在cellfun调用中,我得到的是f行为等同于foo定义为

  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的函数句柄?即给出类似于foo的定义的行为

  b = foo(c)

即^ 2,浪费 a s。

此外,是否可以(有效地)在唯一的 a电话中同时捕获bcellfun

2 个答案:

答案 0 :(得分:6)

来自documentation of cellfun

  

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

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

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

答案 1 :(得分:1)

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

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

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}