微型示例:
function varargout = wrapper(varargin)
varargout = someFunction(varargin);
这就是我先做的事情。但是,例如,如果someFunction = ndgrid
这会产生未定义的单元格数组错误,那么下一次尝试就是使用someFunction(varargin{:})
。这是一个成功的通话,但是调用[a,b] = wrapper([1,2], [3,4])
并不会产生与直接调用ndgrid
相同的结果,那么我做错了什么?
答案 0 :(得分:36)
实际上,米哈伊尔的答案并不完全正确。如果someFunction是一个函数,即使没有请求也返回一个值,这就是函数指示该值应该分配给ans的方式,Mikhail的包装器将失败。例如,如果someFunction被sin替换,并且你直接比较了运行包装器和运行sin,你会看到:
>> wrapper(0)
>> sin(0)
ans =
0
正确的方法是
function varargout = wrapper( varargin )
[varargout{1:nargout}] = someFunction( varargin{:} );
这种方法起作用的原因是由于MATLAB索引规则中一个鲜为人知的边缘情况,因为至少R2006a(可能更长),这种情况恰好存在于这种情况下。它在MATLAB索引中是一种瑕疵,但被认为是处理这类事情的必要条件。
规则是:
执行下标分配时,如果
然后为未初始化的变量分配一个标量单元格,其中包含右侧返回的值。
例如:
>> clear uninit % just to make sure uninit is uninitialized
>> [uninit{[]}] = sin(0)
uninit =
[0]
答案 1 :(得分:7)
function varargout = wrapper( varargin )
if ~nargout
someFunction( varargin{:} );
else
[varargout{1:nargout}] = someFunction( varargin{:} );
end
答案 2 :(得分:1)
如果输出参数的数量与输入参数的数量相同,则可以使用
function varargout = wrapper(varargin)
[varargout{1:nargin}] = someFunction(varargin{:});
这适用于ndgrid
。