5

If I call a matlab function with: func(1,2,3,4,5) it works perfectly.

But if I do: a=[1,2,3,4,5] %(a[1;2;3;4;5] gives same result)

then:

func(a)

gives me:

??? Error ==> func at 11 Not enough input arguments.

Line 11 in func.m is:

error(nargchk(5, 6, nargin));

I notice that this works perfectly:

func(a(1),a(2),a(3),a(4),a(5))

How can I use the vector 'a' as a parameter to a function? I have another function otherfunc(b) which returns a, and would like to use its output as a paramater like this func(otherfunc(b)).

Tombola
  • 1,131
  • 5
  • 15
  • 26
  • possible duplicate of [Calling function with varying number of parameters in Matlab](http://stackoverflow.com/questions/12741843/calling-function-with-varying-number-of-parameters-in-matlab) – fdermishin Jan 12 '14 at 10:26

7 Answers7

6

Comma-seperated lists (CSL) can be passed to functions as parameter list,

so what you need is a CSL as 1,2,3,4,5 constructed from an array.

It can be generated using cell array like this:

a=[1,2,3,4,5];
c = num2cell(a);
func(c{:});
misssprite
  • 616
  • 9
  • 17
3

Maybe you could try with nargin - a variable in a function that has the value of the number of input arguments. Since you have a need for different length input, I believe this can best be handled with varargin, which can be set as the last input variable and will then group together all the extra input arguments..

function result = func(varargin)
    if nargin == 5: % this is every element separately
        x1 = varargin{1}
        x2 = varargin{2}
        x3 = varargin{3}
        x4 = varargin{4}
        x5 = varargin{5}
    else if nargin == 1: % and one vectorized input
        [x1 x2 x3 x4 x5] = varargin{1}

I've written x1...x5 for your input variables

Dedek Mraz
  • 814
  • 7
  • 14
1

Another method would be to create a separate inline function. Say you have a function f which takes multiple parameters:

f = f(x1,x2,x3)

You can call this with an array of parameter values by defining a separate function g:

g = @(x) f(x(1),x(2),x(3))

Now, if you have a vector of parameters values v = [1,2,3], you will be able to call f(v(1),v(2),v(3)) using g(v).

0

Just make the function take a single argument.

function result = func(a)
    if ~isvector(a)
        error('Input must be a vector')
    end
end
0

Since arguments to functions in Matlab can themselves be vectoes (or even matrices) you cannot replace several arguments with a single vector.
If func expects 5 arguments, you cannot pass a single vector and expect matlab to understand that all five arguments are elements in the vector. How can Matlab tell the difference between this case and a case where the first argument is a 5-vector?

So, I would suggest this solution

s.type = '()';
s.subs = {1:5};
func( subsref( num2cell( otherfunc(b) ), s ) )

I'm not sure if this works (I don't have matlab here), but the rationale is to convert the 5-vector a (the output of otherfunc(b)) into a cell array and then expand it as 5 different arguments to func.
Please not the difference between a{:} and a(:) in this subsref.

Shai
  • 111,146
  • 38
  • 238
  • 371
0

You could create a function of the following form:

function [ out ] = funeval( f, x )
   string = 'f(';
   for I = 1:length(x)
      string = strcat( string, 'x(' , num2str(I), '),' );
   end
   string( end ) = ')';
   out = eval( string );
end

In which case, funeval( func, a ) gives the required output.

0

Use eval:

astr = [];
for i=1:length(a)
    astr     = [astr,'a(',num2str(i),'),']; % a(1),a(2),...
end
astr  = astr(1:end-1);
eval(['func(' astr ');']);