Multiple outputs from anonymous function

216 views (last 30 days)
Morten Nissov
Morten Nissov on 10 Dec 2019
Edited: Walter Roberson on 4 May 2022
I have a function of the following form
function [out1, out2] = demo_fcn( in )
out1 = in(1);
out2 = in(2);
end
which gets called by
[out1, out2] = @(x) demo_fcn(x);
but anonymous functions are not allowed more than one outputs. This is clearly a simplified example, the application is for a nonlinear programming problem where out1 is the objective function and out2 is the gradient calculation. I am not sure how I can structure this differently or in a way which is acceptable by MATLAB syntax.
Note the error messge is
Only functions can return multiple values.
  3 Comments
Guillaume
Guillaume on 10 Dec 2019
So, I'm a bit unclear on what you are asking.
As pointed out by Stephen, anonymous functions can return more than one output (as long as the function delegates the actual processing to a function that returns more than one output).
Yes, some functions such as your demo_fun can't be implemented as an anonymous function since it's made of two statements and anonymous functions in matlab are limited to one non-branching statement. However, you're never forced to use anonymous functions, they're just syntactic sugar that can always be replaced by named functions. You can pass a handle to your demo_fun to fmincon and others, so why can't you use demo_fun as you have written it?

Sign in to comment.

Answers (3)

Star Strider
Star Strider on 10 Dec 2019
One option is to have the two outputs to one vector, then separate them in a subsequent assignment:
demo_fcn = @(in) [in(1) in(2)];
in = rand(2,1)
Out = demo_fcn(in)
Out1 = Out(1)
Out2 = Out(2)
This works, however I cannot tell if it does what you want it to do.
  2 Comments
Star Strider
Star Strider on 10 Dec 2019
O.K.
The approach I used would clearly not allow concatenation such as that unless the outputs of the two sub-functions were in cell arrays. That adds the additional complication of recovering the double array from the cell array, however that is not diffcult.
I encourage you to experiment with that approach.

Sign in to comment.


gotjen
gotjen on 25 Jun 2021
Edited: Walter Roberson on 4 May 2022
Hey Morten, even though its years later I want to give you my solution to this problem. I use the matlab function disperse ( https://www.mathworks.com/matlabcentral/fileexchange/33866-disperse ) which is availble on the File Exchange but should absoutely become a built in function.
disperse splits arrays into multiple output arguments. You can use it to conveniently get multple outputs from an anonymous function
f = @(x) disperse( [x, 2*x] )
[a, b] = f(1:10)
% a = [ 1 2 ... 10 ];
% b = [ 2 4 ... 20 ];
Nice pet example but lets do something useful with it.
Say we have a structure array, and we want to get the 3rd element from two vector members of that structure. We want to get them out as two arrays
% data is some large data structure we use to pass around parameters for
% our model.
[A, B] = arrayfun( @(s) disperse([ s.wavelength(3), s.absorption(3)]), data);
This one-liner avoids some ugly for-loop when all we want to do is slice our data structure in an unusual way.

Pritesh Mody
Pritesh Mody on 4 May 2022
Edited: Pritesh Mody on 4 May 2022
The built-in "deal" function allows this. There is an example in the help for deal.

Categories

Tags

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by