Specialised matrices - mikera/vectorz GitHub Wiki
Vectorz supports a wide range of specialised matrix classes.
The reason for this is simple: specialised matrix classes provide much more efficient operations in certain situations. For example, multiplying a large vector by a diagonal matrix can easily be 100x faster using the specialised DiagonalMatrix implementation.
When to use
Specialised matrices have both advantages and disadvantages: whether you use them or not is a judgement call. If in doubt, you should benchmark for your specific use case.
Pros:
- Use much less storage space: e.g. a diagonal n*n matrix requires only n elements of storage
- Provide fast, optimised operations
Cons:
- Elements are constrained, so specialised matrices are usually not fully mutable. Use the
isFullyMutablemethod to check this property for a given matrix instance. - Slower for arbitrary operations not suited to this matrix type
Classes available
Here are some of the specialised matrix classes available in Vectorz:
AMatrix: base class for all matrix typesMatrix: general purpose matrix, backed by a fully packeddouble[]arrayDiagonalMatrix: a square diagonal matrix. all values not on the main diagonal are constrained to 0.0StridedMatrix: a matrix backed by adouble[]array but supporting strided indexing and offsets into the array. Very useful for lightweight views / submatrices of a regularMatrix.ZeroMatrix: an immutable matrix filled with zeros. Requires no storage for elements, and supports very fast operations.IdentityMatrix: an immutable identity matrix. Requires no storage for elements. Requires no storage for elements, and supports very fast operations.ScalarMatrix: an efficient matrix which represents scaling by a single scalar value.PermutationMatrix: a square matrix that permutes another matrix. Has a single1.0in each row and column. Can be used to efficiently permute vectors or other matrices.RowMatrix: an efficient lightweight matrix with a single row.ColumnMatrix: an efficient lightweight matrix with a single column.