Say that I have a function foo
defined as
[a b] = foo(c ).
If I consider a function handle
f = @(c)foo(c)
to be used e.g. in a cellfun
call, what I get is an f
behaving equivalently to a foo
defined like
a = foo(c)
i.e., the returned value b
gets lost.
Therefore, when such an f
is put in a cellfun
call, the output cell will have just the a
s and will miss the b
s (which I currently care about). Visually
cellfun(f,input)
[a(input{1})] ?
[a(input{2})] ?
.... b gets killed along the way
Question: how to define a function handle to foo
which catches just the b
s? i.e. giving a behavior analogous to a definition of foo
like
b = foo(c)
i.e.^2, wasting the a
s.
Moreover, is it possible to (efficiently) catch both a
and b
in a unique cellfun
call?
From the documentation of cellfun
:
[A1,...,Am] = cellfun(func,C1,...,Cn) calls the function specified by function handle func and passes elements from cell arrays C1,...,Cn, where n is the number of inputs to function func. Output arrays A1,...,Am, where m is the number of outputs from function func, contain the combined outputs from the function calls.
So yes, cellfun
can use a multi-output function and in this case it simply returns a number of outputs. If you want to use the second one only, you can use ~
to ignore the first one. The same goes for multiple outputs of anonymous functions - they will be returned if you specify multiple output arguments. Here is a simple code:
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