在八度音程中使用 varargin

use*_*098 5 matlab octave

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

into2.m

function  [result] = into2(x)
    result = x*2;
endfunction
Run Code Online (Sandbox Code Playgroud)

into3.m

function  [result] = into3(x)
    result = x*3;
endfunction
Run Code Online (Sandbox Code Playgroud)

calc.m

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

test1.m(主功能)

function  [] = test1()
    result= calc(@into2,@into3,2);
    disp(result);
endfunction
Run Code Online (Sandbox Code Playgroud)

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

Sue*_*ver 6

问题是它varargin 必须作为函数的最后一个输入参数出现。如果它不是最后一个,则将其简单地视为已命名的 varargin输入参数。从文档中:

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

因此,实际上,您的calc函数在功能上与以下函数没有什么不同:

function result = calc(y, x)
Run Code Online (Sandbox Code Playgroud)

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

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

    result = fn1(x) + fn2(x);
end
Run Code Online (Sandbox Code Playgroud)

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