I need to use a matrix class in my application for operations like Eigenvalue decomposition,LUDecomposition
as well as normal matrix ops like multiplication,addition ,transposition etc.
I decided to use jama at present since I am quite familiar with it and because I am currently
working with small datasets.
But probably later, I would want to move to a better matrix library like ejml
or some future invention as the amount of data grows.
How should I design my matrix class so that it is not bound to a particular implementation?
I would like an interface similar to as below.
class MyMatrix{
public MyMatrix addWithAnother(MyMatrix b){
...
}
public MyMatrix multiplyWithAnother(MyMatrix b){
...
}
public double[][] getData(){
..
}
public SomeEigenDecomposition getEigenValueDecomposition(){
...
}
Should I put the implementation matrix class(jama Matrix or such) as a field and delegate calls to it?
Still that would bind me to jama ,I think.
How can I make the above totally free from the implementation?Any design pattern,java gurus please advise.
thanks
mark
Since there is no de facto or formal standard interface to different Java matrix implementations, you could consider minimizing the effort in switching implementations by designing a Facade that implements the matrix ops you want, coupled with a matrix factory (via eg. Abstract Factory, Factory Method) that instantiates the actual matrix you wish to use under the covers.
Then you would only have to implement Adapter code calling the underlying matrix implementation and externally conforming to your Facade interface, for each new implementation you wish to integrate.
Not ideal, but since the implementations have varying interfaces, you have to glue them into your code somehow. At least this approach shields your client/test code from the change underneath the Facade.