将varargin传递给MATLAB中的嵌套类方法

时间:2016-07-10 04:09:11

标签: matlab class methods

我想以相同的方式解析几个类方法的变量输入,所以我写了一个方法来做到这一点,并打算根据需要从其他方法调用它。但是,当我从methodB拨打methodA时,varargin{:}不会作为其单元格内容传递,而是作为另一个单元格数组传递 - 类似于我没有包含{:}

有没有人知道为什么内容没有通过?

methods
    function varargout = methodA(obj,varargin)
        [obj,t.start,t.stop,prn,elevLim,t.interval] = methodB(varargin{:});
    end

    function varargout = methodB(varargin)
        % parse inputs here...

        %output parsed inputs to calling function
        varargout = {obj,t.start,t.stop,prn,elevLim,t.interval};
    end
end

1 个答案:

答案 0 :(得分:3)

当您尝试使用问题中所述的代码时,您将收到有用的错误消息。如果您写methodB(varargin),则此消息为:

  

未定义函数'methodB'表示'double'类型的输入参数。

编写methodB(varargin{:})时,它是:

  

未定义函数'methodB'用于'cell'类型的输入参数。

这里的主要问题是你没有明确地将methodB的第一个参数定义为对象变量。这是必需的,因为methodB是所谓的ordinary method,因为它没有被定义为静态。代码中还有一些其他问题。例如methodA永远不会向varargout分配内容而methodB应该返回obj,而methodB也没有定义。

普通方法的解决方案

  • function varargout = methodB(obj,varargin)需要有一个明确定义的对象变量,因此定义的第一行应该是:obj。但是,如果我们在方法本身中不需要~,我们可以将其替换为methodB(obj,varargin{:}),因此不会将其分配给变量。
  • 要调用该方法,您需要使用正确的语法来调用它,obj.methodB(varargin{:})classdef nestedvarargin properties end methods function varargout = methodA(obj,varargin) [t.start,t.stop,prn,elevLim,t.interval] = methodB(obj,varargin{:}); % call ordinary method (syntax 1) % [t.start,t.stop,prn,elevLim,t.interval] = obj.methodB(varargin{:}); % call ordinary method (syntax 2) varargout = {t.start,t.stop,prn,elevLim,t.interval}; end function varargout = methodB(~,varargin) % extract desired values from varargin (for example leave 3rd argument out) varargout = {varargin{1},varargin{2},varargin{4},varargin{5},varargin{6}}; end end end

以下是验证它的工作代码:

methodB

使用静态方法的解决方案

  • 另一种方法是将baseclass.methodB(varargin{:})定义为静态,并将其命名为classdef nestedvarargin properties end methods function varargout = methodA(obj,varargin) [t.start,t.stop,prn,elevLim,t.interval] = nestedvarargin.methodB(varargin{:}); % call static method varargout = {t.start,t.stop,prn,elevLim,t.interval}; end end methods(Static) function varargout = methodB(varargin) % extract desired values from varargin (for example leave 3rd argument out) varargout = {varargin{1},varargin{2},varargin{4},varargin{5},varargin{6}}; end end end 。在这种情况下,不需要显式定义的对象变量。

代码如下所示:

methodB

测试

为了验证功能,您可以使用以下两行。正如5中定义的那样,第三个参数应该被省略,第六个参数也应该被省略(在下面的例子中是testobj = nestedvarargin; [a,b,c,d,e] = testobj.methodA(1,2,[],3,4,5,[]) )。

a =
     1
b =
     2
c =
     3
d =
     4
e =
     5

输出符合预期:

Traceback (most recent call last):
  File "logistic_regression.py", line 29, in <module>
    import numpy as np
ImportError: No module named numpy