MATLAB:varargin(单元)与fminsearch(双)不兼容?
我有一些使用变量参数构建的函数,但现在我想优化这些函数。然而,在目前的形式下,varargin似乎不能很好地与FMINSEARCH配合使用?我能做什么?有什么不对劲吗 我正在努力做到以下几点:MATLAB:varargin(单元)与fminsearch(双)不兼容?,matlab,Matlab,我有一些使用变量参数构建的函数,但现在我想优化这些函数。然而,在目前的形式下,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
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,它要求参数为单元格类型
非常感谢您的帮助。您应该编写一个包装函数,该函数接受向量作为参数,并以
fn\u backtest\u v002
预期的格式传递它们。例如:
function out = fn_backtest_v0002(varargin)
.... %Your code here
end
和包装器函数:
function out = fn_backtest_v0002_wrapper(vec)
out = -fn_backtest_v0002(num2cell(vec));
end
function [ out ] = fn_backtest_v0002_wrapper( vec )
cell = num2cell(vec);
out = fn_backtest_v0002(cell{:});
end
然后,您可以将包装器函数与fminsearch
一起使用:
start = [3,0,0.5,10,0.05,0,1,1];
max = fminsearch(y,@fn_backtest_v0002_wrapper);
另一种选择是重新编写
fn\u backtest\u v002
以具有向量输入参数(这比您的情况下的varargin
更有意义。感谢Andrey提出的包装函数的想法。(我是一名编程新手)
我就是这样做的
创建包装器函数:
function out = fn_backtest_v0002_wrapper(vec)
out = -fn_backtest_v0002(num2cell(vec));
end
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);
+我建议您重写函数,使用向量输入而不是向量输入。您的包装器想法奏效了。我无法让您的确切代码正常工作,但我找到了答案。