Matrix Examples
Some examples. You shouldn't use toString()
to find out about matricies. Mdoc calls it on each line anyway - not much i can do about that.
import vecxt.all.*
import vecxt.BoundsCheck.DoBoundsCheck.yes
import narr.*
val nestedArr = NArray(
NArray[Double](1.0, 2.0, 3.5),
NArray[Double](3.0, 4.0, 5.0),
NArray[Double](6.0, 7.0, 8.0)
)
// nestedArr: Array[Array[Double]] = [[D@7b51740b
val matInt = Matrix.fromRows(
NArray[Int](1,2),
NArray[Int](3,4)
)
// matInt: Matrix[Int] = ([I@7caecaea,(2,2))
val matrix = Matrix.fromRowsArray(nestedArr)
// matrix: Matrix[Double] = ([D@33816026,(3,3))
val matrix2 = Matrix.fromColumnsArray(nestedArr)
// matrix2: Matrix[Double] = ([D@2948e772,(3,3))
matrix.shape
// res0: Tuple2[Row, Col] = (3,3)
matrix.printMat
// res1: String = 1.0 2.0 3.5
// 3.0 4.0 5.0
// 6.0 7.0 8.0
matrix2.printMat
// res2: String = 1.0 3.0 6.0
// 2.0 4.0 7.0
// 3.5 5.0 8.0
matrix.col(1).printArr
// res3: String = [2.0,4.0,7.0]
matrix.row(2).printArr
// res4: String = [6.0,7.0,8.0]
// Note that indexing is done via a tuple.
matrix((1, 2))
// res5: Double = 5.0
More matrix operations...
import vecxt.all.*
import vecxt.BoundsCheck.DoBoundsCheck.yes
import narr.*
val mat1 = Matrix(NArray(1.0, 4.0, 2.0, 5.0, 3.0, 6.0), (2, 3))
// mat1: Matrix[Double] = ([D@1a4c51c,(2,3))
println(mat1.printMat)
// 1.0 2.0 3.0
// 4.0 5.0 6.0
val mat2 = Matrix(NArray(7.0, 9.0, 11.0, 8.0, 10, 12.0), (3, 2))
// mat2: Matrix[Double] = ([D@79740679,(3,2))
println(mat1.printMat)
// 1.0 2.0 3.0
// 4.0 5.0 6.0
val result = mat1.matmul(mat2)
// result: Matrix[Double] = ([D@7ab2ef9c,(2,2))
result.printMat
// res8: String = 58.0 64.0
// 139.0 154.0
// @ is a reserved character, so we can't just copy numpy syntax... experimental
val result2 = mat1 @@ mat2
// result2: Matrix[Double] = ([D@335f38d0,(2,2))
result2.printMat
// res9: String = 58.0 64.0
// 139.0 154.0
// opperator precedence...
val result3 = Matrix.eye[Double](2) + mat1 @@ mat2
// result3: Matrix[Double] = ([D@395b6307,(2,2))
result3.printMat
// res10: String = 59.0 64.0
// 139.0 155.0
val mat3 = mat2.transpose + mat1
// mat3: Matrix[Double] = ([D@200c4b6c,(2,3))
mat3.printMat
// res11: String = 8.0 11.0 14.0
// 12.0 15.0 18.0
(mat2.transpose - mat1).printMat
// res12: String = 6.0 7.0 8.0
// 4.0 5.0 6.0
// TODO: Check performance of vectorised version on JVM
mat1.exp.printMat
// res13: String = 2.718281828459045 7.38905609893065 20.085536923187668
// 54.598150033144236 148.4131591025766 403.4287934927351
// TODO: Check performance of vectorised version on JVM
mat1.log.printMat
// res14: String = 0.0 0.6931471805599453 1.0986122886681098
// 1.3862943611198906 1.6094379124341003 1.791759469228055
(mat1.sum(Dimension.Rows).printMat)
// res15: String = 6.0
// 15.0
(mat1.max(Dimension.Cols).printMat)
// res16: String = 4.0 5.0 6.0
(mat1.min(Dimension.Rows).printMat)
// res17: String = 1.0
// 4.0
(mat1.product(Dimension.Cols).printMat)
// res18: String = 4.0 10.0 18.0
(mat1.mapRowsToScalar(_.sum).printMat)
// res19: String = 6.0
// 15.0
(mat1.mapRows(r => r / r.sum).printMat)
// res20: String = 0.16666666666666666 0.3333333333333333 0.5
// 0.26666666666666666 0.3333333333333333 0.4
(mat1.mapColsToScalar(_.sum).printMat)
// res21: String = 5.0 7.0 9.0
(mat1.mapCols(r => r / r.sum).printMat)
// res22: String = 0.2 0.2857142857142857 0.0
// 0.8 0.7142857142857142 0.0
mat1.horzcat(mat1).printMat
// res23: String = 1.0 2.0 3.0 1.0 2.0 3.0
// 4.0 5.0 6.0 4.0 5.0 6.0
mat2.vertcat(mat2).printMat
// res24: String = 7.0 8.0
// 9.0 10.0
// 11.0 12.0
// 7.0 8.0
// 9.0 10.0
// 11.0 12.0
Slicing
Index via a Int
, NArray[Int]
or a Range
to slice a matrix. The ::
operator is used to select all elements in a dimension.
import vecxt.all.*
import vecxt.BoundsCheck.DoBoundsCheck.yes
import narr.*
val mat = Matrix.fromRows(
NArray[Double](1.0, 2.0, 3.0),
NArray[Double](4.0, 5.0, 6.0),
NArray[Double](7.0, 8.0, 9.0)
)
// mat: Matrix[Double] = ([D@242ad39,(3,3))
mat(::, ::).printMat
// res25: String = 1.0 2.0 3.0
// 4.0 5.0 6.0
// 7.0 8.0 9.0
mat(1, ::).printMat
// res26: String = 4.0 5.0 6.0
mat(::, 1).printMat
// res27: String = 2.0
// 5.0
// 8.0
mat(1, 1).printMat
// res28: String = 5.0
mat(0 to 1, 0 to 1).printMat
// res29: String = 1.0 2.0
// 4.0 5.0
mat(NArray.from[Int](Array(0, 2)), 0 to 1).printMat
// res30: String = 1.0 2.0
// 7.0 8.0
In this article