【问题标题】:how to design a java matrix class implementation independent如何设计一个独立的java矩阵类实现
【发布时间】:2011-05-31 17:58:54
【问题描述】:

我需要在我的应用程序中使用矩阵类来进行特征值分解、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大师指教。

谢谢

标记

【问题讨论】:

    标签: java matrix implementation


    【解决方案1】:

    由于对于不同的 Java 矩阵实现没有事实上的或正式的标准接口,您可以考虑通过设计实现矩阵的 Facade 来尽量减少切换实现的工作量你想要的操作,再加上一个矩阵工厂(通过例如抽象工厂工厂方法)实例化你希望在幕后使用的实际矩阵。

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

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

    【讨论】:

    • 感谢您的快速响应..我会尝试并回来..我对设计模式有点不满意..再次感谢 Paul Sonier..
    • 您应该能够使用突出显示的名称找到模式描述,但如果遇到困难,请返回。祝你好运,提前考虑到这一点做得很好。
    【解决方案2】:

    将上面的(或类似的,根据需要)定义为接口。

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

    通过接口调用你的类。当你想使用不同的实现时,创建一个不同的类来实现相同的接口,但在内部做不同的事情;你可以把它放到你使用之前实现的地方,因为接口是完全一样的。

    【讨论】:

      【解决方案3】:

      更多的是长评论而不是答案:

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

      我喜欢 Java,但 Java 在这一切方面都很糟糕,因为它没有可用的数字基类(我想出了这一点,编写自己的矩阵库来帮助我学习数学)。 Java 处理数学的语法也很不舒服。 (我最终在 Java 中创建了所有类,但使用了 Groovy 中的它们,从而获得了更好的数学语法。)

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

      【讨论】:

        猜你喜欢
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        相关资源
        最近更新 更多