在scala中矢量化2d数组的最有效方法

时间:2016-05-16 14:09:07

标签: scala

假设我有

val A = Array(Array(1,2,3), Array(4,5,6))

其中每个条目对应一个矩阵的行。将(向列)矢量化的最有效方法是什么?  val vec = Array(1,4,2,5,3,6)

我目前正在实施的是val vec = A.transpose.flatten。这是最有效的方法吗?

1 个答案:

答案 0 :(得分:4)

最有效的方法是以旧方式进行:循环索引。

def transposeFlat(a: Array[Array[Int]]): Array[Int] = {
  var n = 0
  var i = 0
  while (i < a.length) { n += a(i).length; i += 1 }
  val b = new Array[Int](n)
  val m = n / a.length;
  i = 0
  var j = 0
  while (j < m) {
    var k = 0
    while (k < a.length) {
      b(i) = a(k)(j)
      i += 1
      k += 1
    }
    j += 1
  }
  b
}

这比transpose.flatten快约10倍(取决于JVM优化的程度,在我的机器上使用64 x 256阵列的范围为8-18x,如果只有一个,则速度提高50倍)单行,所以transpose.flatten在展平之前无意义地为每个元素创建一个单元素数组。)

大的性能差异的原因是双重的。首先,我写的方法并没有创建任何中间集合。其次,Array操作不是专门用于原语的,因此通常会有一些开销。