5

如果我使用以下命令调用 matlab 函数: func(1,2,3,4,5) ,它将完美运行。

但如果我这样做: a=[1,2,3,4,5] %(a[1;2;3;4;5] 给出相同的结果)

然后:

函数(一)

给我:

???错误 ==> func at 11 输入参数不足。

func.m 中的第 11 行是:

错误(nargchk(5, 6, nargin));

我注意到这非常有效:

函数(a(1),a(2),a(3),a(4),a(5))

如何使用向量“a”作为函数的参数?我有另一个返回 a 的函数 otherfunc(b) ,并希望将其输出用作参数,例如func(otherfunc(b))

4

7 回答 7

6

逗号分隔列表 (CSL) 可以作为参数列表传递给函数,

所以你需要的是一个1,2,3,4,5从数组构造的 CSL。

它可以使用像这样的单元格数组生成:

a=[1,2,3,4,5];
c = num2cell(a);
func(c{:});
于 2015-05-06T11:31:43.433 回答
3

也许您可以尝试使用 nargin - 函数中的一个变量,它具有输入参数数量的值。由于您需要不同长度的输入,我相信这最好用 varargin 处理,它可以设置为最后一个输入变量,然后将所有额外的输入参数组合在一起。

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}

我已经x1...x5为你的输入变量写了

于 2013-02-25T23:31:25.923 回答
1

另一种方法是创建一个单独的内联函数。假设您有一个带有多个参数的函数 f:

f = f(x1,x2,x3)

您可以通过定义一个单独的函数 g 来使用参数值数组调用它:

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

现在,如果您有一个参数值向量 v = [1,2,3],您将能够使用 g(v) 调用 f(v(1),v(2),v(3))。

于 2016-10-20T19:53:35.847 回答
0

您可以创建以下形式的函数:

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

在这种情况下,funeval( func, a )给出所需的输出。

于 2013-12-24T16:01:47.140 回答
0

由于 Matlab 中函数的参数本身可以是向量(甚至矩阵),因此您不能用单个向量替换多个参数。
如果func需要 5 个参数,则不能传递单个向量并期望 matlab 理解所有五个参数都是向量中的元素。Matlab 如何区分这种情况和第一个参数是 5 向量的情况?

所以,我建议这个解决方案

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

我不确定这是否有效(我这里没有 matlab),但基本原理是将 5 向量a( 的输出otherfunc(b))转换为元胞数组,然后将其扩展为 5 个不同的参数func
请不要区分a{:}a(:)in this subsref

于 2013-02-25T21:50:51.890 回答
0

只需让函数接受一个参数。

function result = func(a)
    if ~isvector(a)
        error('Input must be a vector')
    end
end
于 2013-02-25T20:04:23.380 回答
0

使用评估:

astr = [];
for i=1:length(a)
    astr     = [astr,'a(',num2str(i),'),']; % a(1),a(2),...
end
astr  = astr(1:end-1);
eval(['func(' astr ');']);
于 2014-02-07T14:26:50.450 回答