Scala中的6维或更多维数组



我正在研究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

那么人们通常如何处理创建高维数组呢?这是留给第三方库来实现的,还是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使用类似的技术对图像数据(他们也做本地分块))。这不是一个普遍有用的事情,这就是为什么你倾向于在数学库中找到它。

相关内容

  • 没有找到相关文章

最新更新