【问题标题】:Extending matlab classes: new methods for built-in classes扩展 matlab 类:内置类的新方法
【发布时间】:2014-09-15 00:07:09
【问题描述】:

我继承了一个完整的工具箱,最后一次修订是在 2006 年,我必须将它更新到最新版本的 Matlab。这个工具箱定义了一些类并定义了内置类的方法。更具体地说,它为控制系统工具箱类 lti、ss、zpk 和 tf 的对象创建了一些额外的方法。

第一部分,重建新类,已经完成。我在使用现有类的新方法时遇到问题。

由于代码是在较旧版本的 Matlab 中编写的,因此它使用 @lti、@ss、@zpk 等类文件夹来定义新方法。现在我需要保留功能,但使用新的 OOP 模型,其中并非所有 @-folders 都是可见的。

有人知道怎么做吗?

【问题讨论】:

  • @Alfabravo 非常感谢。我以前看过这个答案。它解释了我理解的包和类的文件夹层次结构。但它没有说明(Matlab 文档也没有说明)如何为现有类引入新方法。我想子类化是一种选择,但我必须使用不同的名称,这需要大量的重新编码。

标签: matlab matlab-class


【解决方案1】:

由于我没有运气尝试找到解决方案,我不得不自己找到一个解决方案。这是我想出的方法。

工具箱为 zpk 类提供了三个新方法。我创建了一个名为 sdzpk 的新类,并将其声明为内置 zpk 类的子类。然后,无论在哪里使用任何新方法,我都会先将对象转换为新类,然后再将其传递给方法。

以下代码可以更好地说明这一点:

类定义文件:

    classdef sdzpk < zpk & sdlti

        methods (Access = public)

            function obj = sdzpk(varargin)

                % Constructor method. Long code here to perform data validation
                % and pass information to the zpk constructor

                obj = obj@zpk(args{:});
            end

            % Existing methods
            % This are the old files I inherited. No need to edit them.

           tsys = ctranspose(sys);
           sys = delay2z(sys);
           sysr = minreal(sys,tol);
           F = minreals(F,tol);
           FP = setpoles(F,p);
           F = symmetr(F,type,tol);
           F = z2zeta(F,tol);
        end       
    end

在工具箱中的多个位置调用了 minreals 函数。所有这些调用都替换为:

    minreals(sdzpk(obj))

这样,我确保使用了新类并应用了正确的方法。

我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多