在八度音阶中使用varargin

时间:2017-01-17 01:18:27

标签: matlab octave

我试图在八度音阶中使用varargin,但似乎遇到了一些问题。这是我的代码:

into2.m

function  [result] = into2(x)
    result = x*2;
endfunction

into3.m

function  [result] = into3(x)
    result = x*3;
endfunction

calc.m

function  [result1] = calc(varargin, x)
    fn1 = varargin{1};
    fn2 = varargin{2};
    result1 = fn1(x) + fn2(x);
endfunction

test1.m (主要功能)

function  [] = test1()
    result= calc(@into2,@into3,2);
    disp(result);
endfunction

test1()是主函数调用calc()并传递两个函数句柄和一个标量。我希望varargin应该@into2,@into3x应该有2。但是,varargin@into2,x有@into3。我尝试改变顺序,但传递的两个函数不会进入一个参数;每个参数只有一个函数。我相信varargin应该有一个单元格,但似乎不起作用。我使用的是Octave 4.2。 (将MATLAB放入标签中,因为两者应该相似。)

1 个答案:

答案 0 :(得分:3)

问题是varargin 必须显示为函数的 last 输入参数。如果它不是最后一个,那么它将被简单地视为输入参数,名为 varargin。来自documentation

  

如果特殊参数名称varargin在函数参数列表的末尾出现,则表示该函数采用可变数量的输入参数

因此,实际上,您的calc功能在功能上与以下内容没有区别:

function result = calc(y, x)

您要做的是将varargin放在输入参数列表的最后,并修改calc中的逻辑。

function result = calc(x, varargin)
    fn1 = varargin{1};
    fn2 = varargin{2};

    result = fn1(x) + fn2(x);
end

作为旁注,我不清楚为什么在这种情况下你需要使用varargin,因为你实际上并没有可变数量的输入。