Using fminsearch on a Function with Multiple Outputs
13 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Tomppx
el 6 de Jul. de 2017
Comentada: Walter Roberson
el 15 de Mzo. de 2022
Hi,
I have a function called calculateValues, which is stored in a seperate .m file, and takes two inputs ( x and a), while producing 3 outputs ( out1, out2, and out3):
[out1, out2, out3] = calculateValues(x,a);
I would now like to use MatLab's fminsearch to minimise the third output (out3) of my function calculateValues with respect to the variable x (leaving a as just a constant, i.e. not varied as part of the optimisation). Therefore I wanted to do something like the following:
out3min = fminsearch(@(x)calculateValues(x,a),x0);
However, it seems like the default output to be minimised is out1. I guess I need to force the anonymous function @(x)calculateValues(x,a) to return only out3. Does anyone have any suggestions how it can be done? Maybe a way to nest anonymous functions to achieve this?
Many Thanks
2 comentarios
Ben Cook
el 15 de Mzo. de 2022
I have a similar issue, with the difference that I would like to know what out1 and out2 are.
The best answer (and what I currently do) is to redo the final calculation, but this seems a bit "nasty" surely there is a more elegant solution?
Walter Roberson
el 15 de Mzo. de 2022
You could memoize() -- and you could have the function detect when nargout is 3 and return the values then.
For example,
memoized_objective = memoize(@real_objective);
memoized_objective.CacheSize = 50;
objective = @(x) memo_driver(x, memoized_objective);
[bestx, fval] = fmincon(objective, ....)
[out1, out2, out3] = memo_driver(bestx);
function varargout = memo_driver(x, memoized_objective)
[out1, out2, out3] = memoized_objective(x);
if nargout == 1
varargout{1} = out3;
else
varargout = {out1, out2, out3};
end
end
Respuesta aceptada
Walter Roberson
el 6 de Jul. de 2017
It is not possible to use an anonymous function to select a particular output from a function. You need to use an actual function.
function result = lastoutput(fun, varargin)
n = nargout(fun);
outs = cell(1,n);
[outs{:}] = fun(varargin{:});
result = outs{end};
And now you can
out3min = fminsearch( @(x)lastoutput(@calculateValues,x,a), x0);
2 comentarios
Sean de Wolski
el 7 de Jul. de 2017
Yes, you can have a subfunction of a parent function or script (subfunctions of scripts new in 16b)
Más respuestas (0)
Ver también
Categorías
Más información sobre Function Creation en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!