在Matlab中调用具有不同参数数量的函数

7
我正在使用符号工具箱生成Matlab函数。但是,生成的函数的输入数量随所需对象(例如,开关数量)的数量而变化。对于2个和3个开关,生成的函数如下所示:
y = fun(a1,a2,b1,b2)
y = fun(a1,a2,a3,b1,b2,b3)

在使用此函数的脚本中,我建立了这些参数的向量:
a = [a1 a2 ...]

我想要的是直接调用生成的函数或创建一个包装函数,这样当我改变开关数量时就不需要改变调用语句。更加复杂的是,这些变量是ACADO变量。这意味着矩阵和逐元素操作都是不允许的(即必须使用标量进行所有数学运算,并且符号工具箱中的方程必须写成标量形式)。
2个回答

12

您可能正在寻找使用单元数组和{:}运算符。它将单元格的内容更改为逗号分隔列表。结果可以作为参数传递给函数。例如:

v2 = {a1, a2, b1, b2};
v3 = {a1, a2, a3, b1, b2, b3};

这是一个示例函数:

function fun(varargin)
    display(['number of parameters: ' num2str(nargin)]);

您可以如下调用函数,对于不同数量的参数它是'透明的'。

fun(v2{:})
number of parameters: 4

fun(v3{:})
number of parameters: 6

2
你可以使用 varargin 来创建具有可变数量输入参数的函数。
function fun(varargin)
a = cell2mat(varargin); % works only if arguments indeed only consists of scalars.

% your code comes hereafter

1
我认为这并不能解决我的问题,因为我无法使用可变数量的参数来创建函数,因为它是由符号工具箱生成的(http://www.mathworks.se/help/symbolic/matlabfunction.html)。我尝试使用vargin但无法使其正常工作:f = @(x,y) (x+y); vargin {1} = 1; vargin {2} = 2; f(vargin) - Torstein I. Bø
1
@angainor 提供的答案可能是你应该采取的方法。 - H.Muster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接