Passing variable from anonymous objective function to main workspace

7 views (last 30 days)
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

Stephen23
Stephen23 on 29 Jul 2020
Edited: Stephen23 on 29 Jul 2020
You can do this easily with nargin:
function val = objfun(x,v1,v2)
persistent data
if ~nargin
val = data;
return
end
... your code
end
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;
end
end
% call the nested function
myNestedFunction(42);
end
The above code would be saved to a file named myMainFunction.m. It would be called from the command line as
>> x = myMainFunction;

Categories

Find more on Problem-Based Optimization Setup in Help Center and File Exchange

Products


Release

R2018a

Community Treasure Hunt

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

Start Hunting!