Uploaded image for project: 'Commons Math'
  1. Commons Math
  2. MATH-230

Implement Sparse Matrix Support

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 2.0
    • 2.0
    • None
    • None
    • N/A

    Description

      I needed a way to deal with large sparse matrices using commons-math RealMatrix, so I implemented it. The SparseRealMatrixImpl is a subclass of RealMatrixImpl, and the backing data structure is a Map<Point,Double>, where Point is a struct like inner-class which exposes two int parameters row and column. I had to make some changes to the existing components to keep the code for SparseRealMatrixImpl clean. Here are the details.

      1) RealMatrix.java:

      • added a new method setEntry(int, int, double) to set data into a matrix
        2) RealMatrixImpl.java:
      • changed all internal calls to data[i][j] to getEntry(i,j).
      • for some methods such as add(), subtract(), premultiply(), etc, there
        was code that checked for ClassCastException and had two versions,
        one for a generic RealMatrix and one for a RealMatrixImpl. This has
        been changed to have only one that operates on a RealMatrix. The
        result is something like auto-type casting. So if:
        RealMatrixImpl.add(RealMatrix) returns a RealMatrixImpl
        SparseRealMatrixImpl.add(RealMatrix) returns a SparseRealMatrixImpl
        3) SparseRealMatrixImpl added as a subclass of RealMatrixImpl.
        4) LUDecompositionImpl changed to use a clone of the passed in RealMatrix
        instead of its data[][] block, and now it uses clone.getEntry(row,col)
        calls instead of data[row][col] calls.
        5) LUDecompositionImpl returned RealMatrixImpl for getL(), getU(), getP()
        and solve(). It now returns the same RealMatrix impl that is passed
        in through its constructor for these methods.
        6) New test for SparseRealMatrixImpl, mimics the tests in RealMatrixImplTest,
        7) New static method to create SparseRealMatrixImpl out of a double[][] in
        MatrixUtils.createSparseRealMatrix().
        but using SparseRealMatrixImpl.
        8) Verified that all JUnit tests pass.

      Attachments

        1. SparseRealMatrixTest.java
          25 kB
          Sujit Pal
        2. SparseRealMatrix.java
          11 kB
          Sujit Pal
        3. RealMatrixImplPerformanceTest.java
          2 kB
          Sujit Pal
        4. patch-2.txt
          2 kB
          Sujit Pal
        5. math-230.diff
          49 kB
          Ismael Juma

        Issue Links

          Activity

            People

              luc Luc Maisonobe
              sujitpal Sujit Pal
              Votes:
              1 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: