假设我将函数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
电话中同时捕获b
和cellfun
?
答案 0 :(得分:6)
[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}