Cannot pass function handle as an argument of a function

血红的双手。 提交于 2019-12-25 03:41:19

问题


I'm new to Matlab and I'm trying to write custom function in matlab that would take function handle as one of its arguments. I'm getting this error all the time:

Error using subsindex
Function 'subsindex' is not defined for values of class 'function_handle'.

Trying to debug I performed following test: I run command x = fminbnd(@humps, 0.3, 1). I proceeded as expected - I got result x = 0.6370. So I created custom function called train and I copied ALL the code of function fminbnd to the file train.m. The only thing that I changed is the name, so that code of functions fminbnd and train is now identical except for the names.

Now I run both functions with the same argument and the custom function throws error while original fminbnd returns correct answer. Here is the code:

>> x = fminbnd(@humps, 0.3, 1)

x =

    0.6370

>> x = train(@humps, 0.3, 1)
Error using subsindex
Function 'subsindex' is not defined for values of class 'function_handle'.

Here is header of function train (everything else is copied from fminbnd):

function [xf,fval,exitflag,output] = train(funfcn,ax,bx,options,varargin)

Where is the problem?


回答1:


Doing a which train showed me that there is a function in the neural network toolbox of the same name.

/Applications/MATLAB_R2009b.app/toolbox/nnet/nnet/@network/train.m  % network method

You may be running the nnet train.m rather than the one you think you're running. Are you in the directory containing your train.m? When I made sure I was in the right directory, I got it to work:

>> which train
/Users/myuserid/train.m

>> x = train(@humps,0.3,1)

x =

    0.6370

Maybe you can name your file something else like myfminbnd.m instead?




回答2:


Instead of duplicating the whole fminbnd function, try:

function varargout = myfminbnd(varargin)
    varargout = cell(1,nargout(@fminbnd));
    [varargout{:}] = fminbnd(varargin{:});
end

this will work as an "alias" to the existing function:

>> fminbnd(@(x)x.^3-2*x-5, 0, 2)
ans =
       0.8165

>> myfminbnd(@(x)x.^3-2*x-5, 0, 2)
ans =
       0.8165

(you can get the other output arguments as well)



来源:https://stackoverflow.com/questions/10746977/cannot-pass-function-handle-as-an-argument-of-a-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!