我试图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放入标签中,因为两者应该是相似的。)
问题是它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在这种情况下使用,因为您实际上没有可变数量的输入。