Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Scala隐式类清单[T]在Array.fill(..)中为空_Generics_Scala_Null_Matrix_Scala 2.8 - Fatal编程技术网

Generics Scala隐式类清单[T]在Array.fill(..)中为空

Generics Scala隐式类清单[T]在Array.fill(..)中为空,generics,scala,null,matrix,scala-2.8,Generics,Scala,Null,Matrix,Scala 2.8,我开始在Scala中摆弄泛型,这是一块很难打破的曲奇。我的想法是通过编写一个通用的矩阵类来学习它,以便在我的并行计算项目中使用 但是,在实例化新矩阵时,我在使用Array.fill时遇到问题。以下是我的矩阵代码: 当心砖墙 此操作失败,但出现以下异常: Exception in thread "main" scala.MatchError: null at scala.reflect.ClassManifest$.arrayType(ClassManifest.scala:206)

我开始在Scala中摆弄泛型,这是一块很难打破的曲奇。我的想法是通过编写一个通用的矩阵类来学习它,以便在我的并行计算项目中使用

但是,在实例化新矩阵时,我在使用Array.fill时遇到问题。以下是我的矩阵代码:

当心砖墙

此操作失败,但出现以下异常:

Exception in thread "main" scala.MatchError: null
    at scala.reflect.ClassManifest$.arrayType(ClassManifest.scala:206)
    at scala.Array$.fill(Array.scala:254)
    at dm8xx.matrix.immutable.Matrix$.apply(Matrix.scala:12)
    at dm8xx.matrix.immutable.Matrix.$times(Matrix.scala:37)
    at dm8xx.matrix.MatrixTest$.main(MatrixTest.scala:19)
    at dm8xx.matrix.MatrixTest.main(MatrixTest.scala)
有人能告诉我为什么类清单此时为空吗?很抱歉,输入了这么多代码,但我无法判断错误在哪一点,所以我必须报告所有内容。也许当我得到一个好的答案时,我可以删除不相关的部分

好的,现在代码可以工作了,但当然它至少比直接实现慢10倍,例如,使用Double…如果有人感兴趣,这就是最终矩阵的样子:

package dm8xx.matrix.immutable
import scala.util.Random

/*
 * Bring your sunglasses...
 */

object Matrix {
  def apply[T](m: Int, n: Int, v: T)(implicit nn: Numeric[T], mm: ClassManifest[T]): Matrix[T] = {
    new Matrix[T](Array.fill(m, n)(v))
  }
  def apply[T](m: Int, n: Int)(implicit num: Numeric[T], cm: ClassManifest[T]): Matrix[T] = Matrix[T](m, n, num.zero)
  def apply(m: Int, n: Int, r: Random): Matrix[Double] =
    new Matrix(Array.fill[Double](m, n) { Math.floor(r.nextDouble() * 100) })
}

class Matrix[T: Numeric: ClassManifest](val data: Array[Array[T]]) {
  val num = implicitly[Numeric[T]]
  val cm: ClassManifest[T] = implicitly
  val m = data.size
  val n = data(0).size
  def apply(i: Int, j: Int) = data(i)(j)

  def map(f: T => T) = new Matrix(data.map(_.map(f)))

  def pieceWise(f: (T, T) => T, that: Matrix[T]): Matrix[T] = {
    val temp: Array[Array[T]] = Array.ofDim[T](m, n)
    for (i <- 0 until m; j <- 0 until n) temp(i)(j) = f(data(i)(j), that.data(i)(j))
    return new Matrix(temp)
  }
  def +(that: Matrix[T]) = pieceWise(num.plus(_, _), that)
  def -(that: Matrix[T]) = pieceWise(num.minus(_, _), that)
  def *(that: Matrix[T]) = {
    val temp = Matrix[T](m, that.n, num.zero)
    for (i <- 0 until m; j <- 0 until n; k <- 0 until that.n)
      temp.data(i)(k) = num.plus(temp.data(i)(k), num.times(data(i)(j), that.data(j)(k)))
    temp
  }

  override def toString() = (for (i <- 0 until m) yield "\n" + (for (j <- 0 until n) yield data(i)(j))).toString

}
这似乎有效:

class Matrix[T: Numeric: ClassManifest](val data: Array[Array[T]]) {
  val num = implicitly[Numeric[T]]
  val cm: ClassManifest[T] = implicitly
...
尝试使用清单而不是类清单


数组在包含原语时需要额外的处理,因为它们是具体化的,但是ClassManifests用于处理类名称是赠送的

是的。为什么呢?另外,如果有人感兴趣,在*函数中,它应该是num.zero而不是num.one。@Felix因为,否则,创建新数组的数据上的方法将没有可用的类清单。有人能推荐一个关于使用隐式值进行类型推断的好解释吗,或者用示例给出一个好的简短解释吗?
package dm8xx.matrix.immutable
import scala.util.Random

/*
 * Bring your sunglasses...
 */

object Matrix {
  def apply[T](m: Int, n: Int, v: T)(implicit nn: Numeric[T], mm: ClassManifest[T]): Matrix[T] = {
    new Matrix[T](Array.fill(m, n)(v))
  }
  def apply[T](m: Int, n: Int)(implicit num: Numeric[T], cm: ClassManifest[T]): Matrix[T] = Matrix[T](m, n, num.zero)
  def apply(m: Int, n: Int, r: Random): Matrix[Double] =
    new Matrix(Array.fill[Double](m, n) { Math.floor(r.nextDouble() * 100) })
}

class Matrix[T: Numeric: ClassManifest](val data: Array[Array[T]]) {
  val num = implicitly[Numeric[T]]
  val cm: ClassManifest[T] = implicitly
  val m = data.size
  val n = data(0).size
  def apply(i: Int, j: Int) = data(i)(j)

  def map(f: T => T) = new Matrix(data.map(_.map(f)))

  def pieceWise(f: (T, T) => T, that: Matrix[T]): Matrix[T] = {
    val temp: Array[Array[T]] = Array.ofDim[T](m, n)
    for (i <- 0 until m; j <- 0 until n) temp(i)(j) = f(data(i)(j), that.data(i)(j))
    return new Matrix(temp)
  }
  def +(that: Matrix[T]) = pieceWise(num.plus(_, _), that)
  def -(that: Matrix[T]) = pieceWise(num.minus(_, _), that)
  def *(that: Matrix[T]) = {
    val temp = Matrix[T](m, that.n, num.zero)
    for (i <- 0 until m; j <- 0 until n; k <- 0 until that.n)
      temp.data(i)(k) = num.plus(temp.data(i)(k), num.times(data(i)(j), that.data(j)(k)))
    temp
  }

  override def toString() = (for (i <- 0 until m) yield "\n" + (for (j <- 0 until n) yield data(i)(j))).toString

}
class Matrix[T: Numeric: ClassManifest](val data: Array[Array[T]]) {
  val num = implicitly[Numeric[T]]
  val cm: ClassManifest[T] = implicitly
...