在matlab中我可以省略函数的参数,例如
function res = caller(a, b)
...
我可以用
来调用它caller(12)
但是我怎么能进一步传递这个缺席的论点,例如:
function res = caller(a, b)
callee(a, b)
...
如果在没有secong参数的情况下调用caller
,那么如果没有第二个参数调用callee
,我怎么能这样做呢?
更新
假设您有许多相互调用的函数
function res = caller01(a, b)
...
function res = caller02(a, b)
...
function res = caller03(a, b)
...
function res = caller04(a, b)
...
你想要
1)使参数b
可选
2)可以将默认委托给被调用者
据我所知,Matlab在这里是不完整的,需要我将每次调用包装到callee中:
if exist('b', 'var')
callee(a, b);
else
callee(a);
end
这应该在每个来电者中重复。
答案 0 :(得分:4)
这里有不同的选择。
选项1
function res = caller(varargin)
callee(varargin{:})
...
在这里,我们捕获varargin
中的所有输入参数,并将其取消选中传递给callee
。
选项2
function res = caller(a, b)
if nargin == 0
callee()
elseif nargin == 1
callee(a)
else if nargin == 2
callee(a, b)
end
...
这里我们检查输入参数的数量,并用我们给出的参数调用callee
。
选项3
function res = caller(a, b)
if nargin<1
a = rand(10);
end
if nargin<2
b = 'default value';
end
callee(a, b)
...
这里我们检查输入参数,并对未指定的输入参数使用默认值。
编辑:此处也可以进行混合操作。假设a
是必需参数,b
是可选参数。我们让MATLAB处理所需的参数(它在未提供时自动生成相应的错误消息),并将b
放入varargin
,我们可以用callee
调用相同数量的function res = caller(a,varargin)
callee(a,varargin{:})
if numel(varargin)>=1
b = varargin{1};
end
...
我们得到的输入参数,并解压缩以生成我们进一步处理所需的局部变量:
public class MyApp extends Application {
private static AppLWP instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
答案 1 :(得分:0)
我通常做一个简单的'if block',据我所知,如果你想在提供的表格中保留你的caller(a,b)
功能,这是不可避免的。
我经常使用灵活的东西:
function res = caller(a, b)
if exist('b','var')
callee(a,b)
else
callee(a)
end
end
或者你可以使用varargin
和'pipe'进入任何参数,直接进入callee
,正如Cris已经提到的那样,并处理被调用者中的任何varargin。
function res = caller(varargin)
callee(varargin{:})
end