[ 
https://issues.apache.org/jira/browse/MATH-230?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12656099#action_12656099
 ] 

Sujit Pal commented on MATH-230:
--------------------------------

Ok, thanks, now understand more fully the justification for the OpenIntHashMap, 
thanks for the lucid explanation.

I am uploading the following attachments:
1) SparseMatrixImpl.java - extends AbstractRealMatrixImpl and uses the 
get/setEntry methods provided. Uses a static inner class OpenIntHashMap for 
data storage.
2) SparseMatrixImplTest.java - all tests run except for the ones involving 
LUDecompositionImpl - they are testInverse() and testExamples(), commented out. 
The reason seems to be that LUDecompositionImpl wants the double[][] data array 
to work with, which is available only from a RealMatrixImpl.
  It seems to be simple enough to replace the various lu[i][j] calls with a 
local RealMatrix.get/setEntry() call, something like this:
  // lu = realMatrix.data();
  RealMatrix rm = realMatrix.copy();
 ...
  // lu[i][j] = v;
  rm.setEntry(i,j,v);
 ... etc.
  But when I did this locally, I started getting errors about non singularity, 
and quite a few other tests began to fail, so I put the LUDecompositionImpl 
back to the svn version.
  It may be better, as Ismael pointed out, to remove the getData() method out 
of the RealMatrix interface and move it to the RealMatrixImpl, since getData() 
probably makes sense for dense matrices.
3) Changed AbstractRealMatrix.toString() to reflect the class name of the 
extending class. Changed visibility of checkRowIndex and checkColumnIndex from 
private to protected to allow usage within SparseMatrixImpl.

I think the next step would be to make LUDecompositionImpl work without 
RealMatrix.getData() and use get/setEntry() methods instead.




> Implement Sparse Matrix Support
> -------------------------------
>
>                 Key: MATH-230
>                 URL: https://issues.apache.org/jira/browse/MATH-230
>             Project: Commons Math
>          Issue Type: Improvement
>    Affects Versions: 2.0
>         Environment: N/A
>            Reporter: Sujit Pal
>            Assignee: Luc Maisonobe
>            Priority: Minor
>             Fix For: 2.0
>
>         Attachments: math-230.diff, RealMatrixImplPerformanceTest.java
>
>
> 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.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to