2

私は 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 が奨励している他のデータ構造はありますか?

4

2 に答える 2

3
// 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を参照してください

于 2015-06-03T14:42:21.147 に答える
2

本当に任意の数の次元が必要な場合は、通常、単一のフラット配列と、次元によってインデックス付けされた 2 番目の配列を使用して、必要な要素を取得します。たとえば、

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は画像データに同様の手法を使用します (ローカル チャンクも行います))。これは、実際には一般的に有用なことではありません。そのため、数学ライブラリで見つける傾向があります。

于 2015-06-03T18:50:20.440 に答える