【问题标题】:How to define & init Matrix in Scala如何在 Scala 中定义和初始化矩阵
【发布时间】:2014-09-25 10:32:51
【问题描述】:

我有一个具有二维数组作为私有成员的类 - k 行和 n 列(定义矩阵时大小未知)。

我想用一种特殊的方法初始化矩阵:initMatrix,它将设置矩阵中的行数和列数,并将所有数据初始化为0。

我看到了一种通过以下方式初始化多维数组的方法:

  private var relationMatrix = Array.ofDim[Float](numOfRows,numOfCols)

但是我怎样才能在没有任何大小的情况下定义它,然后再初始化呢?

【问题讨论】:

  • 如果您出于效率原因延迟初始化(例如,可能并不总是使用它),请考虑将其定义为 lazy val。在 Scala 中,最好使您的类不可变,因此不鼓励后期初始化成员。

标签: arrays scala matrix


【解决方案1】:

您是否考虑过使用选项?

class MyClass() {
  private var relationMatrix: Option[Array[Array[Float]]] = None

  def initMatrix(numOfRows:Int, numOfCols:Int): Unit = {
    relationMatrix = Some(/* Your initialization code here */)
  }
}

这种方法的优点是你可以随时知道你的矩阵是否被初始化,通过使用relationMatrix.isDefined,或者通过模式匹配,

def matrixOperation: Float = relationMatrix match { 
  case Some(matrix) =>
    // Matrix is initialized
  case None =>
    0 // Matrix is not initialized
}

或者在上面贴图,像这样:

def matrixOperation: Option[Float] = relationMatrix.map { 
  matrix: Array[Array[Float]] =>
  // Operation logic here, executes only if the matrix is initialized 
}

【讨论】:

    【解决方案2】:

    要声明一个可变的二维浮点数组而不设置尺寸和值,请考虑

    var a: Array[Array[Float]] = _
    a: Array[Array[Float]] = null
    

    为了初始化它考虑像这样使用Array.tabulate

    def init (nRows: Int, nCols: Int) = Array.tabulate(nRows,nCols)( (x,y) => 0f )
    

    例如,

    a = init(2,3)
    

    交付

    Array[Array[Float]] = Array(Array(0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0))
    

    更新null 初始化相比,Option(@Radian 已经建议)的使用证明了类型安全且在运行时更健壮;因此,还要考虑Option(Array.tabulate)

    【讨论】:

      【解决方案3】:

      var matrix: Array[Array[Float]] = null — 这声明了一个与您的类型相同的变量

      【讨论】:

      • null 仅在 Scala 中用于 Java 兼容性,除非 Java 强制,否则不应使用它
      【解决方案4】:

      您可以使您的 initMatrix 方法成为伴生对象的一部分。

      class Matrix(numOfRows:Int, numOfCols:Int) {
          private var relationMatrix = Array.ofDim[Float](numOfRows, numOfCols)
      // your code there
      
      }
      
      object Matrix {
          def initMatrix(numOfRows:Int, numOfCols:Int) = Matrix(numOfRows, numOfCols)
      }
      
      var myMatrix = Matrix.initMatrix(3,5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-22
        • 2022-08-06
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多