trait Mat {
type Row = Array[Double]
type Matrix = Array[Row]
def transpose(m : Matrix) : Matrix = m.transpose
def dotProd(v1:Row,v2:Row) = (v1 zip v2).map{ t => t._1 * t._2 }.sum
def mXm( m1:Matrix, m2:Matrix ) =
for( m1row <- m1 ) yield
for( m2col <- m2.transpose ) yield
dotProd(m1row, m2col )
case class RichMatrix(m : Matrix){
def T = transpose(m)
def *(that:RichMatrix) = mXm( this.m, that.m )
}
implicit def pimp(m:Matrix) = new RichMatrix(m)
}
object MatTest extends Mat {
def main(args: Array[String]) {
val A : Matrix = Array(
Array( 2.0, 0.0 ),
Array( 3.0,-1.0 ),
Array( 0.0, 1.0 ),
Array( 1.0, 1.0 ))
val B : Matrix = Array(
Array( 1.0, 0.0, 2.0 ),
Array( 4.0, -1.0, 0.0 ))
val C : Matrix = Array(Array( 2.0, 0.0, 4.0 ),
Array( -1.0, 1.0, 6.0 ),
Array( 4.0, -1.0, 0.0 ),
Array( 5.0, -1.0, 2.0 ))
val D = A * B
println(D.map(f => println(f.mkString(","))))
}
}
评论