MATLAB:varargin(cell)与fminsearch(double)不兼容?

时间:2014-04-30 13:35:21

标签: 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 96)
FMINSEARCH only accepts inputs of data type double.

从FMINSEARCH的简单例子中,应该使用一个向量,但是我的函数中有varargin,它需要参数为单元格类型。

任何帮助表示感谢。

2 个答案:

答案 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);