105 lines
2.7 KiB
Text
105 lines
2.7 KiB
Text
import "./fmt" for Fmt
|
|
import "./matrix" for Matrix
|
|
|
|
// matrix-matrix element wise ops
|
|
class MM {
|
|
static add(m1, m2) { m1 + m2 }
|
|
static sub(m1, m2) { m1 - m2 }
|
|
|
|
static mul(m1, m2) {
|
|
if (!m1.sameSize(m2)) Fiber.abort("Matrices must be of the same size.")
|
|
var m = Matrix.new(m1.numRows, m1.numCols)
|
|
for (i in 0...m.numRows) {
|
|
for (j in 0...m.numCols) m[i, j] = m1[i, j] * m2[i, j]
|
|
}
|
|
return m
|
|
}
|
|
|
|
static div(m1, m2) {
|
|
if (!m1.sameSize(m2)) Fiber.abort("Matrices must be of the same size.")
|
|
var m = Matrix.new(m1.numRows, m1.numCols)
|
|
for (i in 0...m.numRows) {
|
|
for (j in 0...m.numCols) m[i, j] = m1[i, j] / m2[i, j]
|
|
}
|
|
return m
|
|
}
|
|
|
|
static pow(m1, m2) {
|
|
if (!m1.sameSize(m2)) Fiber.abort("Matrices must be of the same size.")
|
|
var m = Matrix.new(m1.numRows, m1.numCols)
|
|
for (i in 0...m.numRows) {
|
|
for (j in 0...m.numCols) m[i, j] = m1[i, j].pow(m2[i, j])
|
|
}
|
|
return m
|
|
}
|
|
}
|
|
|
|
// matrix-scalar element wise ops
|
|
class MS {
|
|
static add(m, s) { m + s }
|
|
static sub(m, s) { m - s }
|
|
static mul(m, s) { m * s }
|
|
static div(m, s) { m / s }
|
|
static pow(m, s) { m.apply { |e| e.pow(s) } }
|
|
}
|
|
|
|
// scalar-matrix element wise ops
|
|
class SM {
|
|
static add(s, m) { m + s }
|
|
static sub(s, m) { -m + s }
|
|
static mul(s, m) { m * s }
|
|
|
|
static div(s, m) {
|
|
var n = Matrix.new(m.numRows, m.numCols)
|
|
for (i in 0...n.numRows) {
|
|
for (j in 0...n.numCols) n[i, j] = s / m[i, j]
|
|
}
|
|
return n
|
|
}
|
|
|
|
static pow(s, m) {
|
|
var n = Matrix.new(m.numRows, m.numCols)
|
|
for (i in 0...n.numRows) {
|
|
for (j in 0...n.numCols) n[i, j] = s.pow(m[i, j])
|
|
}
|
|
return n
|
|
}
|
|
}
|
|
|
|
var m = Matrix.new([ [3, 5, 7], [1, 2, 3], [2, 4, 6] ])
|
|
System.print("m:")
|
|
Fmt.mprint(m, 2, 0)
|
|
System.print("\nm + m:")
|
|
Fmt.mprint(MM.add(m, m), 2, 0)
|
|
System.print("\nm - m:")
|
|
Fmt.mprint(MM.sub(m, m), 2, 0)
|
|
System.print("\nm * m:")
|
|
Fmt.mprint(MM.mul(m, m), 2, 0)
|
|
System.print("\nm / m:")
|
|
Fmt.mprint(MM.div(m, m), 2, 0)
|
|
System.print("\nm ^ m:")
|
|
Fmt.mprint(MM.pow(m, m), 6, 0)
|
|
|
|
var s = 2
|
|
System.print("\ns = %(s):")
|
|
System.print("\nm + s:")
|
|
Fmt.mprint(MS.add(m, s), 2, 0)
|
|
System.print("\nm - s:")
|
|
Fmt.mprint(MS.sub(m, s), 2, 0)
|
|
System.print("\nm * s:")
|
|
Fmt.mprint(MS.mul(m, s), 2, 0)
|
|
System.print("\nm / s:")
|
|
Fmt.mprint(MS.div(m, s), 3, 1)
|
|
System.print("\nm ^ s:")
|
|
Fmt.mprint(MS.pow(m, s), 2, 0)
|
|
|
|
System.print("\ns + m:")
|
|
Fmt.mprint(SM.add(s, m), 2, 0)
|
|
System.print("\ns - m:")
|
|
Fmt.mprint(SM.sub(s, m), 2, 0)
|
|
System.print("\ns * m:")
|
|
Fmt.mprint(SM.mul(s, m), 2, 0)
|
|
System.print("\ns / m:")
|
|
Fmt.mprint(SM.div(s, m), 8, 6)
|
|
System.print("\ns ^ m:")
|
|
Fmt.mprint(SM.pow(s, m), 3, 0)
|