LinAlg provides data types and operations for algebraic vectors and matrices.
LinAlg provides data types and operations for algebraic vectors and matrices.
Vector and Matrix elements can be of arbitrary type, provided that a factory
for that element type is available. Currently, factories exist for Double
,
Float
, Long
, Int
, Short
, Byte
and Char
.
Vector and matrix (row and column) indices can be any integer (to state more
precisely, an index must be in the interval [Mindex, Maxdex]
, as defined in
the Index
object). But only elements corresponding to a subset of that whole
integer range actually are stored (the concrete elements), while all other
elements by definition are zero (virtual elements).
This concept (which I got to value a long time ago with the ALGOL68 library prelude TORRIX [1]) does not only provide a natural approach to operations with vectors and matrixes of different index ranges, but also prevents from index-out-of-bounds exceptions.
Concrete index ranges (those indices that correspond to concrete elements) implicitly or explicitly are assigned when a vector or matrix is created. By default, it starts at 1 and extends to the number of elements specified, but this is customizable.
Vector
s and Matrix
es both are immutable by design, so there exist no
update
methods or the like (you cannot do v(i) = something
). There are,
however, builder classes that allow you to build Vector
s and Matrix
es
element by element.
Currently, operations on vectors and matrices require identical element
types. For instance, you can add a Vector[Int]
to another Vector[Int]
,
but you cannot add a Vector[Int]
to another Vector[Double]
.
[1] S. G. van der Meulen, P. Kühling, "Programmieren in ALGOL68", Bd. II (Berlin, New York: de Gruyter), 149-188 (1977)