我有一个类,它有二维数组作为私有成员 - k行和n列(定义矩阵时大小不知道)。
我想使用一种特殊方法初始化Matrix:initMatrix,它将设置矩阵中的行数和列数,并将所有数据初始化为0。
我看到了一种以下列方式初始化多维数组的方法:
private var relationMatrix = Array.ofDim[Float](numOfRows,numOfCols)
但是如何在没有任何大小的情况下定义它,并在以后初始化它?
答案 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
- 这声明了一个与你的类型相同的变量