我有使用变量参数构建的函数,但现在我想优化这些函数。但是,在目前的形式中,varargin似乎与FMINSEARCH无法合作?我能做什么?有什么不对吗?
我正在尝试执行以下操作:
y = @(varargin)-fn_backtest_v0002(varargin{:});
start = {3,0,0.5,10,0.05,0,1,1};
max = fminsearch(y,start);
但是我收到了这个错误:
Error using fminsearch (line 96)
FMINSEARCH only accepts inputs of data type double.
从FMINSEARCH的简单例子中,应该使用一个向量,但是我的函数中有varargin,它需要参数为单元格类型。
任何帮助表示感谢。
答案 0 :(得分:2)
您应该编写一个包含vector作为参数的包装函数,并以fn_backtest_v0002
期望获得的格式传递它们。例如:
function out = fn_backtest_v0002(varargin)
.... %Your code here
end
包装函数:
function out = fn_backtest_v0002_wrapper(vec)
out = -fn_backtest_v0002(num2cell(vec));
end
然后,您可以将包装函数与fminsearch
:
start = [3,0,0.5,10,0.05,0,1,1];
max = fminsearch(y,@fn_backtest_v0002_wrapper);
另一个替代方法是重写fn_backtest_v0002
以获得向量输入参数(在您的情况下,这比varargin
更有意义。
答案 1 :(得分:1)
感谢Andrey有关包装功能的想法。 (我是编程新手)。
这正是我做的。
创建包装函数:
function [ out ] = fn_backtest_v0002_wrapper( vec )
cell = num2cell(vec);
out = fn_backtest_v0002(cell{:});
end
然后我可以成功运行以下命令:
y = @(vec)-fn_backtest_v0002_wrapper(vec);
start = [3,0,0.5,10,0.05,0,1,1];
max = fminsearch(y,start);