如何为矩阵乘法创建Seq [Array [Double]]?

时间:2013-01-09 04:41:23

标签: arrays algorithm scala matrix

class MatrixMultiplication {
  def singleThreadedMultiplication(m1:Seq[Array[Double]], m2:Array[Array[Double]] ) ={
    val res =  Array.fill(m1.length, m2(0).length)(0.0)

    for(row <- 0 until m1.length;
        col <- 0 until m2(0).length;
        i   <- 0 until m1(0).length){
      res(row)(col) += m1(row)(i) * m2(i)(col)
    }

    res
  }
}

__

object multiplication {
  def main(args : Seq[Array[Double]], args2 : Array[Double]) : Unit = {
    val matrixmult = new MatrixMultiplication
    var b = new Array[Double](4)
    b = Array(2,1,2,1)
    seq: Seq[Double] = WrappedArray(1, 0, 2, 0)
    matrixmult.singleThreadedMultiplication(Seq[Double],b)
  }
}

所有我需要的是知道如何运行单线程乘法方法,因为它的第一个参数是Seq[Array[Double]]而且我不知道,我没有找到任何方法如何创建一个seq双数组在第二节课。

1 个答案:

答案 0 :(得分:0)

Seq是一个特征,有许多子类实现它。例如ListArrayBuffer。因此,您可以创建Array[Array[Double]]并将其传递给singleThreadedMultiplication。可以使用val array = Array(Array(1.0,2.0,3.0))创建相应的类型,并将其传递给m1中的m2singleThreadedMultiplication

object multiplication {
  def main(args : Seq[Array[Double]], args2 : Array[Double]) : Unit = {
    val matrixmult = new MatrixMultiplication
    matrixmult.singleThreadedMultiplication(args, Array(args2)
  }
}

要运行它并使用传递的参数删除这些行,因为它们未被使用。

var b = new Array[Double](4)
b = Array(2,1,2,1)
seq: Seq[Double] = WrappedArray(1, 0, 2, 0)

然后更改调用以使用传入的参数。

matrixmult.singleThreadedMultiplication(args, Array(args2))

这会运行但java.lang.ArrayIndexOutOfBoundsException函数中有singleThreadedMultiplication

scala> val a = Array(2.0,1.0,2.0,1.0)
b: Array[Double] = Array(2.0, 1.0, 2.0, 1.0)

scala> val b = Array(Array(1.0,0.0,2.0,0.0))
c: Array[Array[Double]] = Array(Array(1.0, 0.0, 2.0, 0.0))

scala> multiplication.main(b, a)
java.lang.ArrayIndexOutOfBoundsException: 1
at MatrixMultiplication$$anonfun$singleThreadedMultiplication$1$$anonfun$apply$mcVI$sp$1$$anonfun$apply$mcVI$sp$2.apply$mcVI$sp
...