http://stackoverflow.com/questions/485896/how-does-one-write-the-pythagoras-theorem-in-scala
http://dcsobral.blogspot.com/search/label/matrix
I got enough guidance from scala community here, and from this write-up[warn: PDF] on new array impl in scala v2.8 .
Here is the result...
//Generic Rep for m X n immutable matrix
class Matrix[T: ClassManifest] private (private val elems: Array[Array[T]])(n: Numeric[T]) {
import n.mkNumericOps
val rows = elems.size //Returns # of rows
val cols = elems(0).size //Returns # of cols
//Returns jth elem in ith row
// 0 <= i < rows And 0 <= j < cols
def apply(i: Int, j: Int): T = elems(i)(j)
//Returns ith row, 0 <= i < rows
def row(i: Int): Array[T] = elems(i).clone
//Returns ith col, 0 <= i < cols
def col(i: Int): Array[T] = elems.map(_(i))
def *(that: Matrix[T]): Matrix[T] = {
if(this.cols != that.rows)
throw new IllegalArgumentException("Can't be multiplied")
else {
val newArr = Array.ofDim[T](this.rows, that.cols)
for(i <- 0 to this.rows-1) {
for(j <- 0 to that.cols-1) {
newArr(i)(j) = this.row(i).zip(that.col(j)).map(a => a._1 * a._2).sum(n)
}
}
new Matrix(newArr)(n)
}
}
/* ------------ More Matrix Operations ----------- */
}
object Matrix {
def apply[T](elems: Array[Array[T]])(implicit n: Numeric[T],m: ClassManifest[T]): Matrix[T] =
new Matrix[T](clone(elems))(n)
private def clone[T: ClassManifest](arr: Array[Array[T]]): Array[Array[T]] = arr.map(_.clone)
}
No comments:
Post a Comment