如何解决如何设计独立的Java矩阵类实现
| 我需要在应用程序中使用矩阵类来进行特征值分解,LUDecomposition等操作 以及正常的矩阵运算,例如乘法,加法,换位等。 我现在决定使用jama,因为我对此非常熟悉,并且因为我目前 使用小型数据集。 但是可能以后,我想移至更好的矩阵库,例如ejml 或随着数据量的增长而出现的一些未来发明。 我应该如何设计矩阵类,使其不绑定到特定的实现? 我想要一个类似于下面的界面。class MyMatrix{
public MyMatrix addWithAnother(MyMatrix b){
...
}
public MyMatrix multiplyWithAnother(MyMatrix b){
...
}
public double[][] getData(){
..
}
public SomeEigenDecomposition getEigenValueDecomposition(){
...
}
我应该将实现矩阵类(jama Matrix等)作为字段并委托对其进行调用吗?
我想那仍然会让我束手无策。
我如何才能使以上内容完全脱离实现?任何设计模式,java专家都请指教。
谢谢
标记
解决方法
由于没有针对不同Java矩阵实现的事实上的或正式的标准接口,因此您可以考虑通过设计实现所需矩阵操作的Facade以及矩阵工厂(例如,通过Abstract Factory,Factory)来最大程度地减少切换实现的工作量。方法)实例化您希望在幕后使用的实际矩阵。
然后,对于要集成的每个新实现,您只需实现调用底层矩阵实现并在外部符合Facade接口的适配器代码。
这并不理想,但是由于实现具有不同的接口,因此您必须以某种方式将其粘合到代码中。至少这种方法可以保护您的客户/测试代码免受Facade之下的更改的影响。
, 将上面的内容(或必要时类似的内容)定义为接口。
创建一个实现该接口的类,该类直接使用Jama库或其他任何类。仅公开公开接口的成员。
通过界面调用您的课程。当您想使用不同的实现时,请创建一个实现相同接口的不同类,但在内部做不同的事情。您可以将其放到使用上一个实现的位置,因为接口完全相同。
, 与其说是答案,不如说是长篇评论:
您最大的问题切换可能是使用基本号码存储。 Jama使用双数组,这对性能非常有用,但是不同的程序包可能会以不同的方式处理数字表示形式。诸如虚数,任意精度数学,有理数或直到后来都无法解析无理数的内部表示之类的数据类型表示形式上的差异可能真的很难计划。
我喜欢Java,但是Java太糟糕了,因为它没有可用的数字基类(我发现编写自己的矩阵库来帮助我学习数学)。 Java处理数学的语法也很不舒服。 (我最终用Java创建了所有类,但从Groovy中使用了它们,从而获得了更好的数学语法。)
因此,我的建议是,不要在外观上投入过多的精力,因为很有可能它也无济于事。如果您确实想执行此操作,则也可以尝试抽象出基础数据类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。