【问题标题】:Convert matrix of numbers (castable to Double) to matrix of Doubles将数字矩阵(可转换为 Double)转换为 Double 矩阵
【发布时间】:2020-11-25 21:53:15
【问题描述】:

我有一个将二维数组作为参数的类。

case class Matrix(matrix: Array[Array[Double]]) {

  def getRow(idx: Int): Array[Double] = matrix(idx)

  def getColumn(idx: Int): Array[Double] = {
    for{
      row <- matrix
    } yield row(idx)
  }
}

事实证明,在 Scala 中不允许这样做:

val arr = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))
val matrix = Matrix(arr)

编译错误:

类型不匹配;
找到:Array[Array[Int]]
必需:Array[Array[Double]]

我想创建一个类,其中所有可转换为双精度类型的矩阵都将隐式转换为双精度二维数组。而且我无法绕过它。这是我已经尝试过的:

case class Matrix(matrix: Array[Array[Double]]) {

  implicit def convertToDouble(inputMatrix: Array[Array[Int]]): Array[Array[Double]] = {
    for{
      row <- matrix
    } yield row.map(_.toDouble)
  }

  def getRow(idx: Int): Array[Double] = matrix(idx)

  def getColumn(idx: Int): Array[Double] = {
    for{
      row <- matrix
    } yield row(idx)
  }
}

但它也不起作用,编译器仍然给出同样的错误。

【问题讨论】:

    标签: scala type-conversion


    【解决方案1】:

    我会简单地添加一个伴随对象,使用适当的应用方法:

    object Matrix {
      def apply(matrix: Array[Array[Int]]): Matrix = {
        Matrix(matrix.map(_.map(_.toDouble)))
      }
    }
    

    然后你可以调用:

    val arr = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))
    val matrix = Matrix(arr)
    

    代码在Scastie 运行。

    【讨论】:

    • 是的,现在它也适用于 Ints,谢谢。仍然不适用于 short、byte 等。当然,我可以为每个 castable-to-double 类型编写应用方法。但对于此类问题,似乎应该有更方便的方法。
    • @GeorgeZorikov 是的,不要使用普通的数组,它们是可变的,不是真正的集合和不变的(这就是失败的原因)。请改用 ListVectorArraySeq 等真正的集合。
    • @GeorgeZorikov,我不会为某些原语寻找通用解决方案。只需为您感兴趣的几种类型实现即可。
    • @LuisMiguelMejíaSuárez 好的,谢谢,我是这样声明的:case class Matrix(matrix: Vector[Vector[_ &gt;: Numeric[_]]]),它可以工作。我想现在更像是 Scal-ish :)
    • @GeorgeZorikov 也许this 可以作为你想做的事情的草稿。请注意,它使用 “高级” 概念,例如 genericstypeclasses
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多