首页 文章

如何设计独立的java矩阵类实现

提问于
浏览
1

我需要在我的应用程序中使用矩阵类进行操作,如特征值分解,LUDecomposition以及正常的矩阵运算,如乘法,加法,换位等 . 我决定使用jama,因为我对它非常熟悉,因为我目前使用小数据集 .

但可能以后,随着数据量的增长,我希望转向更好的矩阵库,如ejml或一些未来的发明 . 我应该如何设计我的矩阵类,使其不受特定实现的约束?我想要一个类似于下面的界面 .

class MyMatrix{

    public MyMatrix addWithAnother(MyMatrix b){
    ...
    }

    public MyMatrix multiplyWithAnother(MyMatrix b){
    ...
    }
    public double[][] getData(){
    ..
    }

    public SomeEigenDecomposition getEigenValueDecomposition(){
    ...
    }

我应该将实现矩阵类(jama Matrix或类似)作为字段并委托调用吗?我认为,这仍然会让我与jama联系在一起 .

如何让上面的内容完全免于实现?任何设计模式,java大师请指教 .

谢谢

标记

3 回答

  • 0

    由于不存在与不同Java矩阵实现的事实或正式标准接口,您可以考虑通过设计实现所需矩阵运算的 Facade 来最小化切换实现的工作量,并与矩阵工厂相结合(例如,通过例如 Abstract FactoryFactory Method )实例化你希望在封面下使用的实际矩阵 .

    然后,对于要集成的每个新实现,您只需实现调用底层矩阵实现的 Adapter 代码,并在外部符合您的 Facade 接口 .

    不理想,但由于实现具有不同的接口,您必须以某种方式将它们粘合到您的代码中 . 至少这种方法可以保护您的客户端/测试代码免受 Facade 下面的更改 .

  • 3

    将上面的内容(或必要的类似内容)定义为界面 .

    创建一个实现该接口的类,它直接使用Jama库或其他任何东西 . 仅公开接口的成员公开 .

    通过界面调用您的课程 . 当您想要使用不同的实现时,创建一个实现相同接口的不同类,但在内部执行不同的操作;您可以将它放在您使用上一个实现的位置,因为界面完全相同 .

  • 2

    更多的评论而不是答案:

    切换的最大问题可能是使用的基本数字存储 . Jama使用双阵列,这对性能很有帮助,但不同的包可能会以不同的方式处理数字表示 . 数据类型表示的差异,如虚数,任意精度数学,有理数或内部表示,直到以后才解决无理数,可能真的很难规划 .

    我喜欢Java,但是Java很糟糕,因为它没有可用的数字基类(我想通过编写我自己的矩阵库来帮助我学习数学) . Java处理数学的语法也很不舒服 . (我最终创建了Java中的所有类,但是从Groovy中使用它们允许更好的数学语法 . )

    所以我的建议是不要在外立面上投入太多精力,因为它很有可能无论如何也无济于事 . 如果您真的想要这样做,您可能会尝试抽象出基础数据类型 .

相关问题