Want to use a vector as parameter to a function, without having to separate its elements

别说谁变了你拦得住时间么 提交于 2019-12-30 05:12:07

问题


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)).


回答1:


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{:});



回答2:


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




回答3:


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).




回答4:


Just make the function take a single argument.

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



回答5:


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.




回答6:


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.




回答7:


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 ');']);


来源:https://stackoverflow.com/questions/15075444/want-to-use-a-vector-as-parameter-to-a-function-without-having-to-separate-its

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