MATLAB: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

我有一些使用变量参数构建的函数,但现在我想优化这些函数。然而,在目前的形式下,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,它要求参数为单元格类型


非常感谢您的帮助。

您应该编写一个包装函数,该函数接受向量作为参数,并以
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);

+我建议您重写函数,使用向量输入而不是向量输入。您的包装器想法奏效了。我无法让您的确切代码正常工作,但我找到了答案。