我如何创建一个Seq[Array[Double]]矩阵乘法


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双数组。

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

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))

运行,但是在singleThreadedMultiplication函数中有一个java.lang.ArrayIndexOutOfBoundsException

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
...

最新更新