Using fminsearch on a Function with Multiple Outputs

조회 수: 8 (최근 30일)
Tomppx
Tomppx 2017년 7월 6일
댓글: Walter Roberson 2022년 3월 15일
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
Ben Cook
Ben Cook 2022년 3월 15일
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
Walter Roberson 2022년 3월 15일
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

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2017년 7월 6일
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
Tomppx
Tomppx 2017년 7월 7일
Hi Walter, thanks for your answer. That is indeed the best way I found to do it - I wrote something similar to simply select out3, as you suggested, where the function dummyFunction is stored in a separate .m file:
function out3 = dummyFunction(x,a)
[~,~,out3] = calculateValues(x,a);
end
Is there at least a way to define this function in-line in my main file (as opposed to having ot have an extra external file) ?
Thanks again for the response.
Sean de Wolski
Sean de Wolski 2017년 7월 7일
Yes, you can have a subfunction of a parent function or script (subfunctions of scripts new in 16b)

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Function Creation에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by