Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

MATLAB: cell arrays of function handles

  1. Apr 23, 2010 #1

    I am trying to store function handles in an array. First attempt was to do something like the following:

    Code (Text):
    for i = 1:5
        r(i) = @(x) [grid(i) - x(1)*(x(2) + value(i))];
    So I would store 5 function handles, each one using the <5x1> vectors "grid" and "value". Result:

    Nonscalar arrays of function handles are not allowed; use cell arrays instead.

    Next I try preallocating r as a cell (r = cell(1,5)). Result:

    Conversion to cell from function_handle is not possible.

    Basically I am having a lot of trouble with the cell arrays and function handles and I don't really know enough about them to be able to interpret the error messages as useful information.

    Can anyone see what I'm doing wrong?


    Also, I am confused about function handles with more than one argument. Here I am using two (x(1) and x(2)), but when I type feval(r(1),2,3) to evaluate r(1) at x = [2,3] it says "Index exceeds matrix dimensions."!

    Eventually I want to define a function handle with arbitrarily large number of arguments, so r(i) will vary for i=1:100 or so, and then a function all = @(x) [r(1); r(2); ... r(100);], to be able to evaluate all these functions at once. But that seems like a long way away right now.

  2. jcsd
  3. Apr 23, 2010 #2
    I'm not quite sure what you want, but this does give something for me:

    grid = 1:5;
    value= 1:5;

    for i = 1:5
    r{i} = @(x) [grid(i) - x(1)*(x(2) + value(i))];

    r{1}([2 3])

    note the curly braces after the r
  4. Apr 26, 2010 #3
    Thanks, this has given me a good starting point.

    I now have a load of function handles stored in an array, but I want to put them all into a single one.

    I am trying to manipulate my functions into the format accepted by a complicated MATLAB algorithm which takes a set of equations in a single function handle.

    So I naturally try to put these into the function like this:

    Code (Text):
    r_total = @(x) [r{1}; r{2}; r{3}; r{4}; r{5}];
    >> r_total([1 2])
    [COLOR="Red"]??? Error using ==> vertcat
    Nonscalar arrays of function handles are not allowed; use cell arrays

    Error in ==> @(x)[r{1};r{2};r{3};r{4};r{5}][/COLOR]
    I would try r_total = {r{1}; r{2}; r{3}; r{4}; r{5}}; but I don't think the code will accept it, it needs [] brackets in all the examples.
    Last edited: Apr 26, 2010
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook