在Scala中制作归零数组的更快方法

use*_*828 4 arrays scala

我在Scala中创建了归零阵列, (0 until Nrows).map (_ => 0).toArray但是有什么更快的吗?map是慢的.

我有同样的问题,但用1而不是O,即我也想加速 (0 until Nrows).map (_ => 1).toArray

chr*_*loy 9

零是Ints数组的默认值,所以只需执行以下操作:

    val array = new Array[Int](NRows)
Run Code Online (Sandbox Code Playgroud)

如果你想要所有这些值都是1,那么使用.fill()(感谢@gourlaysama):

    val array = Array.fill(NRows)(1)
Run Code Online (Sandbox Code Playgroud)

但是,看看它如何在内部工作,它涉及创建一些您不需要的对象.如果速度是您的主要关注点,我怀疑以下(丑陋)方法可能会更快:

    val array = new Array[Int](NRows)
    for (i <- 0 until array.length) { array(i) = 1 }
Run Code Online (Sandbox Code Playgroud)

  • 要使用值初始化数组,可以使用`Array.fill`方法:`val array = Array.fill(NRows)(1)`,而不是手动迭代. (2认同)

elm*_*elm 6

对于多维数组考虑Array.ofDim,例如,

scala> val a = Array.ofDim[Int](3,3)
a: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0))
Run Code Online (Sandbox Code Playgroud)

同样,

scala> val a = Array.ofDim[Int](3)
a: Array[Int] = Array(0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

在这里的背景下,

val a = Array.ofDim[Int](NRows)
Run Code Online (Sandbox Code Playgroud)

要设置(可能非零)初始值,请考虑Array.tabulate,例如,

scala> Array.tabulate(3,3)( (x,y) => 1)
res5: Array[Array[Int]] = Array(Array(1, 1, 1), Array(1, 1, 1), Array(1, 1, 1))

scala> Array.tabulate(3)( x => 1)
res18: Array[Int] = Array(1, 1, 1)
Run Code Online (Sandbox Code Playgroud)