Hello All,
Luc suggested that I move this discussion to the list. Luc posed the
question:
"I don't understand how you intend to separate the API.
Would that mean users would always have to know beforehand the shape of the
matrix they use and manage both the matrix, the data store and the operators
in sync ?"
I think my longwinded report was not as clear as it should have been. I want
to simplify the RealMatrix interface and implementing classes. In my mind's
eye, I see the real matrix interface as describing the shape of the data,
holding that data and giving the user an indexing scheme to get at an
element.
My concern with the current interface is that if different shapes of
matrices are allowed (Diagonal, Symmetric, Triangular, Banded) the matrix
manipulation routines (add, subtract, mult, ...) become very complicated.
In my proposal, I argue that we might have another class, say
MatrixOperations.
It would have routines for Mutlitplication that depend on type. A small
subset of the interface might look like:
public interface MatrixOpsIface{
public SymmetricMatrix selfTimesTranspose( SymmetricMatrix sm );
public SymmetricMatrix selfTimesTranspose( GeneralMatrix sm );
public SymmetricMatrix sandwichProduct( SymmetricMatrix sm,
GeneralMatrix gm);
public SymmetricMatrix sandwichProduct( SymmetricMatrix sm,
SymmericMatrix sm2);
public SymmetricMatrix sandwichProduct( SymmetricMatrix sm,
SymmetricMatrix gm);
public GeneralMatrix multipy( DiagonalMatrix dm, GeneralMatrix gm);
public GeneralMatrix multiply( SymmetricMatrix sm, GeneralMatrix gm);
public DiagonalMatrix multiply( DiagonalMatrix dm, DiagonalMatrix dm);
}
The benefit of doing this would be that you could write highly optimized
multiplication routines dependent on the shape of the matrices. All of the
complexity would be handled by the compiler. The user would simply
instantiate the operations object (maybe these could be static methods), and
call multiply. Adding a new matrix shape would be require an two check ins,
the code for the new matrix as well as a new set of methods for handling
multiplication, etc, with the other types.
Greg
