如何定义& Scala中的init Matrix

时间:2014-08-02 09:12:10

标签: arrays scala matrix

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

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

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

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

但是如何在没有任何大小的情况下定义它,并在以后初始化它?

4 个答案:

答案 0 :(得分:4)

您考虑使用选项吗?

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 
}

答案 1 :(得分:2)

要在不设置尺寸和值的情况下声明浮动的可变2D数组,请考虑

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

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

答案 2 :(得分:1)

您可以将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)

答案 3 :(得分:0)

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