Remove methods from RealMatrix Interface
----------------------------------------

                 Key: MATH-608
                 URL: https://issues.apache.org/jira/browse/MATH-608
             Project: Commons Math
          Issue Type: Improvement
    Affects Versions: 3.0
         Environment: Java
            Reporter: greg sterijevski
            Priority: Minor


The RealMatrix interface describes several methods which take a RealMatrix and 
yield a RealMatrix return. They are:

    RealMatrix multiply(RealMatrix m);
    RealMatrix preMultiply(RealMatrix m);
    RealMatrix power(final int p);
    RealMatrix add(RealMatrix m)
    RealMatrix subtract(RealMatrix m)

There is nothing inherently wrong in making all subclasses of RealMatrix 
implement these methods. However, as the number of subclasses of RealMatrix 
increases, the complexity of these methods will also increase. I think these 
methods should be part of a separate class of 'operators' which handle matrix 
multiplication, addition, subtraction and exponentiation.

Say for example, I implement SymmetricRealMatrix. I would like to store the 
data of a real symmetric in compressed form, so that I only consume (nrow + 
1)*nrow /2 space in memory. When it comes time to implement multiply (for 
example), I must test to see if the RealMatrix given in the argument is also of 
Type SymmetricRealMatrix, since that will affect the algorithm I use to do the 
multiplication. I could access each element of the argument matrix via its 
getter, but efficiency will suffer. One can think of cases where we might have 
a DiagonalRealMatrix times a DiagonRealMatrix. One would not want to store the 
resultant diagonal in a general matrix storage. Keeping track of all of the 
permutations of Symmetrics, Diagonals,..., and their resultants inside of the 
body of a function makes for very brittle code. Furthermore, anytime a new type 
of matrix is defined all matrix multiplication routines would have to be 
updated.  

There are special types of operations which result in particular matrix 
patterns. A matrix times its transpose is itself a symmetric. A general matrix 
sandwiched between another general matrix and its transpose is a symmetric. 
Cholesky decompositions form upper and lower triangular matrices. These are 
common enough occurrences in statistical techniques that it makes sense to put 
them in their own class (perhaps as static methods). It would keep the contract 
of the RealMatrix classes very simple. The ReaMatrix would be nothing more than:

1. Marker (is the matrix General, Symmetric, Banded, Diagonal, 
UpperTriangular..)
2. Opaque data store (except for the operator classes, no one would need to 
know how the data is actually stored).
3. Indexing scheme. 

The reason I bring this up, is that I am attempting to write a 
SymmetricRealMatrix class to support variance-covariance matrices. I noticed 
that there are relatively few subclasses of RealMatrix. While it would be easy 
to hack it up for the handful of implementations that exist, that would 
probably create more problems as the number of types of matrices increases.

Thank you,

-Greg 


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to