Scala 中的 6 维或更多维数组
6- or more dimensional Arrays in Scala
我正在研究 Scala 中的多维数组,发现了一些创建多维数组的简单方法。即:
val my3DimensionalArray = Array.ofDim[Int](3,4,5)
//array with dimensions 3 x 4 x 5
甚至
val myFilledArray = Array.fill[Int](3,4,5)(0)
//Array of same dimension filled with 0's
然而,这仅适用于 1 - 5 维数组:
val my6DimensionalArray = Array.ofDim[Int](3,3,3,3,3,3) //Error
那么人们通常如何处理创建更高维度的数组呢?这是留给第 3 方库来实现,还是 Scala 鼓励我们使用其他数据结构来代替高维数组?
// create array of 5-dim-array => 6 dim array
Array.tabulate(3)(_ => Array.ofDim[Int](3,3,3,3,3))
Array.ofDim
实现使用此模式。参见 https://github.com/scala/scala/blob/v2.11.6/src/library/scala/Array.scala#L216-234
如果您确实需要任意数量的维度,您通常会使用一个平面数组和一个按维度索引的第二个数组,以获取您想要的元素。所以,例如,
class MultiArray(dims: Array[Int]) {
private val array = new Array[Double](dims.product)
private def arrayIndex(index: Array[Int]) = {
var i = index.length - 1
var k = index(i)
var n = 1
while (i > 0) {
n *= dims(i)
k += n * index(i-1)
i -= 1
}
k
}
def apply(index: Array[Int]) = array(arrayIndex(index))
def update(index: Array[Int], value: Double) {
array(arrayIndex(index)) = value
}
}
将是一个开始。有各种数学库可以做这类事情(IIRC Apache Commons Math 做 我不能很快找到一个 Java 数学库,但是 ImgLib2对图像数据使用类似的技术(他们也进行本地分块))。这并不是一件真正有用的事情,这就是为什么您倾向于在数学图书馆中找到它的原因。
我正在研究 Scala 中的多维数组,发现了一些创建多维数组的简单方法。即:
val my3DimensionalArray = Array.ofDim[Int](3,4,5)
//array with dimensions 3 x 4 x 5
甚至
val myFilledArray = Array.fill[Int](3,4,5)(0)
//Array of same dimension filled with 0's
然而,这仅适用于 1 - 5 维数组:
val my6DimensionalArray = Array.ofDim[Int](3,3,3,3,3,3) //Error
那么人们通常如何处理创建更高维度的数组呢?这是留给第 3 方库来实现,还是 Scala 鼓励我们使用其他数据结构来代替高维数组?
// create array of 5-dim-array => 6 dim array
Array.tabulate(3)(_ => Array.ofDim[Int](3,3,3,3,3))
Array.ofDim
实现使用此模式。参见 https://github.com/scala/scala/blob/v2.11.6/src/library/scala/Array.scala#L216-234
如果您确实需要任意数量的维度,您通常会使用一个平面数组和一个按维度索引的第二个数组,以获取您想要的元素。所以,例如,
class MultiArray(dims: Array[Int]) {
private val array = new Array[Double](dims.product)
private def arrayIndex(index: Array[Int]) = {
var i = index.length - 1
var k = index(i)
var n = 1
while (i > 0) {
n *= dims(i)
k += n * index(i-1)
i -= 1
}
k
}
def apply(index: Array[Int]) = array(arrayIndex(index))
def update(index: Array[Int], value: Double) {
array(arrayIndex(index)) = value
}
}
将是一个开始。有各种数学库可以做这类事情(IIRC Apache Commons Math 做 我不能很快找到一个 Java 数学库,但是 ImgLib2对图像数据使用类似的技术(他们也进行本地分块))。这并不是一件真正有用的事情,这就是为什么您倾向于在数学图书馆中找到它的原因。