MATLAB Answers

Passing variable from anonymous objective function to main workspace

3 views (last 30 days)
Mario Malic
Mario Malic on 28 Jul 2020
Commented: Mario Malic on 2 Nov 2020
Hello guys, I have a quick and simple question for you about passing variables from anonymous objective functions.
[x, fval] = fmincon(@(x)objfun(x,var1, var2),x0)
And in this objfun I am calculating and saving some information in variable data (cell). After optimization is done, I would like to have that variable into my workspace. Currently I am declaring it as a global variable and of course since it's bad practice. Is there an alternative way to do it?
Saving into variable data for each iteration seems a little bit tedious.
  1 Comment
Mario Malic
Mario Malic on 2 Nov 2020
+1 on both answers since they both solve the problem. It takes a bit of time for me to understand nested functions, especially the way they are written. I went for Stephen's answer, just because of simplicity.

Sign in to comment.

Accepted Answer

Stephen on 29 Jul 2020
Edited: Stephen on 29 Jul 2020
You can do this easily with nargin:
function val = objfun(x,v1,v2)
persistent data
if ~nargin
val = data;
... your code
and then call it after the fmincon call:
data = objfun();

More Answers (1)

Geoff Hayes
Geoff Hayes on 28 Jul 2020
Mario - consider nesting your optimization function within the main function and have it return the variable to the workspace. See Nested Functions for details. An example of this might be
function [data] = myMainFunction
data = [];
function myNestedFunction(x)
% do something
for k = 1:ceil(x)
data(k) = k;
% call the nested function
The above code would be saved to a file named myMainFunction.m. It would be called from the command line as
>> x = myMainFunction;




Community Treasure Hunt

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

Start Hunting!