假设我有一个函数foo
定义为
[a b] = foo(c ).
如果我考虑函数句柄
f = @(c)foo(c)
例如在cellfun
调用中使用,我得到的是一个行为等同于定义如下foo
的f
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
调用中捕获a
和b
?
> 来自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}