如何使用varargin和varargout包装函数?

时间:2011-02-04 07:27:35

标签: matlab wrapper variadic-functions

微型示例:

function varargout = wrapper(varargin)
varargout = someFunction(varargin);

这就是我先做的事情。但是,例如,如果someFunction = ndgrid这会产生未定义的单元格数组错误,那么下一次尝试就是使用someFunction(varargin{:})。这是一个成功的通话,但是调用[a,b] = wrapper([1,2], [3,4])并不会产生与直接调用ndgrid相同的结果,那么我做错了什么?

3 个答案:

答案 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索引中是一种瑕疵,但被认为是处理这类事情的必要条件。

规则是:

执行下标分配时,如果

  • 下标 - 分配给未初始化的变量AND
  • 未初始化的变量是大括号索引,AND
  • 花括号中的索引为空,AND
  • 左侧出现在方括号内,AND
  • 右侧解析为值/返回输出

然后为未初始化的变量分配一个标量单元格,其中包含右侧返回的值。

例如:

>> 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