RosettaCodeData/Task/Element-wise-operations/Wren/element-wise-operations.wren
2023-12-16 21:33:55 -08:00

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)