March 2014 update

This commit is contained in:
Ingy döt Net 2014-04-02 16:56:35 +00:00
parent 09687c4926
commit a25938f123
1846 changed files with 21876 additions and 5203 deletions

View file

@ -1,39 +1,52 @@
package main
package element
import (
"fmt"
"math"
)
type matrix [][]float64
type binaryFunc64 func(float64, float64) float64
func like(m matrix) matrix {
cols := len(m[0])
r := make([][]float64, len(m))
all := make([]float64, len(m)*cols)
for i := range r {
r[i] = all[i*cols : (i+1)*cols]
}
return r
type Matrix struct {
ele []float64
stride int
}
func elementWiseMM(m1, m2 matrix, f binaryFunc64) matrix {
func MatrixFromRows(rows [][]float64) Matrix {
if len(rows) == 0 {
return Matrix{nil, 0}
}
m := Matrix{make([]float64, len(rows)*len(rows[0])), len(rows[0])}
for rx, row := range rows {
copy(m.ele[rx*m.stride:(rx+1)*m.stride], row)
}
return m
}
func like(m Matrix) Matrix {
return Matrix{make([]float64, len(m.ele)), m.stride}
}
func (m Matrix) String() string {
s := ""
for e := 0; e < len(m.ele); e += m.stride {
s += fmt.Sprintf("%6.3f \n", m.ele[e:e+m.stride])
}
return s
}
type binaryFunc64 func(float64, float64) float64
func elementWiseMM(m1, m2 Matrix, f binaryFunc64) Matrix {
z := like(m1)
for rx, row := range m1 {
for cx, ele := range row {
z[rx][cx] = f(ele, m2[rx][cx])
}
for i, m1e := range m1.ele {
z.ele[i] = f(m1e, m2.ele[i])
}
return z
}
func elementWiseMS(m matrix, s float64, f binaryFunc64) matrix {
func elementWiseMS(m Matrix, s float64, f binaryFunc64) Matrix {
z := like(m)
for rx, row := range m {
for cx, ele := range row {
z[rx][cx] = f(ele, s)
}
for i, e := range m.ele {
z.ele[i] = f(e, s)
}
return z
}
@ -44,55 +57,14 @@ func mul(a, b float64) float64 { return a * b }
func div(a, b float64) float64 { return a / b }
func exp(a, b float64) float64 { return math.Pow(a, b) }
func ewmmAdd(m1, m2 matrix) matrix { return elementWiseMM(m1, m2, add) }
func ewmmSub(m1, m2 matrix) matrix { return elementWiseMM(m1, m2, sub) }
func ewmmMul(m1, m2 matrix) matrix { return elementWiseMM(m1, m2, mul) }
func ewmmDiv(m1, m2 matrix) matrix { return elementWiseMM(m1, m2, div) }
func ewmmExp(m1, m2 matrix) matrix { return elementWiseMM(m1, m2, exp) }
func AddMatrix(m1, m2 Matrix) Matrix { return elementWiseMM(m1, m2, add) }
func SubMatrix(m1, m2 Matrix) Matrix { return elementWiseMM(m1, m2, sub) }
func MulMatrix(m1, m2 Matrix) Matrix { return elementWiseMM(m1, m2, mul) }
func DivMatrix(m1, m2 Matrix) Matrix { return elementWiseMM(m1, m2, div) }
func ExpMatrix(m1, m2 Matrix) Matrix { return elementWiseMM(m1, m2, exp) }
func ewmsAdd(m matrix, s float64) matrix { return elementWiseMS(m, s, add) }
func ewmsSub(m matrix, s float64) matrix { return elementWiseMS(m, s, sub) }
func ewmsMul(m matrix, s float64) matrix { return elementWiseMS(m, s, mul) }
func ewmsDiv(m matrix, s float64) matrix { return elementWiseMS(m, s, div) }
func ewmsExp(m matrix, s float64) matrix { return elementWiseMS(m, s, exp) }
func main() {
m1 := matrix{{3, 1, 4}, {1, 5, 9}}
m2 := matrix{{2, 7, 1}, {8, 2, 8}}
fmt.Println("m1:")
m1.print()
fmt.Println("m2:")
m2.print()
fmt.Println("m1 + m2:")
ewmmAdd(m1, m2).print()
fmt.Println("m1 - m2:")
ewmmSub(m1, m2).print()
fmt.Println("m1 * m2:")
ewmmMul(m1, m2).print()
fmt.Println("m1 / m2:")
ewmmDiv(m1, m2).print()
fmt.Println("m1 ^ m2:")
ewmmExp(m1, m2).print()
s := .5
fmt.Println("s:", s)
fmt.Println("m1 + s")
ewmsAdd(m1, s).print()
fmt.Println("m1 - s:")
ewmsSub(m1, s).print()
fmt.Println("m1 * s:")
ewmsMul(m1, s).print()
fmt.Println("m1 / s:")
ewmsDiv(m1, s).print()
fmt.Println("m1 ^ s:")
ewmsExp(m1, s).print()
}
func (m matrix) print() {
const f = "%6.3f "
for _, r := range m {
for _, e := range r {
fmt.Printf(f, e)
}
fmt.Println()
}
}
func AddScalar(m Matrix, s float64) Matrix { return elementWiseMS(m, s, add) }
func SubScalar(m Matrix, s float64) Matrix { return elementWiseMS(m, s, sub) }
func MulScalar(m Matrix, s float64) Matrix { return elementWiseMS(m, s, mul) }
func DivScalar(m Matrix, s float64) Matrix { return elementWiseMS(m, s, div) }
func ExpScalar(m Matrix, s float64) Matrix { return elementWiseMS(m, s, exp) }

View file

@ -2,90 +2,32 @@ package main
import (
"fmt"
"math"
"element"
)
type matrix struct {
ele []float64
stride int
func h(heading string, m element.Matrix) {
fmt.Println(heading)
fmt.Print(m)
}
func matrixFromRows(rows [][]float64) *matrix {
if len(rows) == 0 {
return &matrix{nil, 0}
}
m := &matrix{make([]float64, len(rows)*len(rows[0])), len(rows[0])}
for rx, row := range rows {
copy(m.ele[rx*m.stride:(rx+1)*m.stride], row)
}
return m
}
func like(m *matrix) *matrix {
return &matrix{make([]float64, len(m.ele)), m.stride}
}
func (m *matrix) print(heading string) {
if heading > "" {
fmt.Print("\n", heading, "\n")
}
for e := 0; e < len(m.ele); e += m.stride {
fmt.Printf("%6.3f ", m.ele[e:e+m.stride])
fmt.Println()
}
}
type binaryFunc64 func(float64, float64) float64
func elementWiseMM(m1, m2 *matrix, f binaryFunc64) *matrix {
z := like(m1)
for i, m1e := range m1.ele {
z.ele[i] = f(m1e, m2.ele[i])
}
return z
}
func elementWiseMS(m *matrix, s float64, f binaryFunc64) *matrix {
z := like(m)
for i, e := range m.ele {
z.ele[i] = f(e, s)
}
return z
}
func add(a, b float64) float64 { return a + b }
func sub(a, b float64) float64 { return a - b }
func mul(a, b float64) float64 { return a * b }
func div(a, b float64) float64 { return a / b }
func exp(a, b float64) float64 { return math.Pow(a, b) }
func ewmmAdd(m1, m2 *matrix) *matrix { return elementWiseMM(m1, m2, add) }
func ewmmSub(m1, m2 *matrix) *matrix { return elementWiseMM(m1, m2, sub) }
func ewmmMul(m1, m2 *matrix) *matrix { return elementWiseMM(m1, m2, mul) }
func ewmmDiv(m1, m2 *matrix) *matrix { return elementWiseMM(m1, m2, div) }
func ewmmExp(m1, m2 *matrix) *matrix { return elementWiseMM(m1, m2, exp) }
func ewmsAdd(m *matrix, s float64) *matrix { return elementWiseMS(m, s, add) }
func ewmsSub(m *matrix, s float64) *matrix { return elementWiseMS(m, s, sub) }
func ewmsMul(m *matrix, s float64) *matrix { return elementWiseMS(m, s, mul) }
func ewmsDiv(m *matrix, s float64) *matrix { return elementWiseMS(m, s, div) }
func ewmsExp(m *matrix, s float64) *matrix { return elementWiseMS(m, s, exp) }
func main() {
m1 := matrixFromRows([][]float64{{3, 1, 4}, {1, 5, 9}})
m2 := matrixFromRows([][]float64{{2, 7, 1}, {8, 2, 8}})
m1.print("m1:")
m2.print("m2:")
ewmmAdd(m1, m2).print("m1 + m2:")
ewmmSub(m1, m2).print("m1 - m2:")
ewmmMul(m1, m2).print("m1 * m2:")
ewmmDiv(m1, m2).print("m1 / m2:")
ewmmExp(m1, m2).print("m1 ^ m2:")
m1 := element.MatrixFromRows([][]float64{{3, 1, 4}, {1, 5, 9}})
m2 := element.MatrixFromRows([][]float64{{2, 7, 1}, {8, 2, 8}})
h("m1:", m1)
h("m2:", m2)
fmt.Println()
h("m1 + m2:", element.AddMatrix(m1, m2))
h("m1 - m2:", element.SubMatrix(m1, m2))
h("m1 * m2:", element.MulMatrix(m1, m2))
h("m1 / m2:", element.DivMatrix(m1, m2))
h("m1 ^ m2:", element.ExpMatrix(m1, m2))
fmt.Println()
s := .5
fmt.Println("\ns:", s)
ewmsAdd(m1, s).print("m1 + s:")
ewmsSub(m1, s).print("m1 - s:")
ewmsMul(m1, s).print("m1 * s:")
ewmsDiv(m1, s).print("m1 / s:")
ewmsExp(m1, s).print("m1 ^ s:")
fmt.Println("s:", s)
h("m1 + s:", element.AddScalar(m1, s))
h("m1 - s:", element.SubScalar(m1, s))
h("m1 * s:", element.MulScalar(m1, s))
h("m1 / s:", element.DivScalar(m1, s))
h("m1 ^ s:", element.ExpScalar(m1, s))
}

View file

@ -0,0 +1,16 @@
require 'matrix'
class Matrix
def element_wise( operator, other )
Matrix.build(row_size, column_size) do |row, col|
self[row, col].send(operator, other[row, col])
end
end
end
m1, m2 = Matrix[[3,1,4],[1,5,9]], Matrix[[2,7,1],[8,2,2]]
puts "m1: #{m1}\nm2: #{m2}\n\n"
[:+, :-, :*, :/, :fdiv, :**, :%].each do |op|
puts "m1 %-4s m2 = %s" % [op, m1.element_wise(op, m2)]
end