Scala:迭代2D数组来做操作



这里的新手。

val arr_one = Array(Array(1, 2), Array(3, 4), Array(5, 6),Array(x, y)..and so on)
val arr_two = Array(Array(2,3), Array(4, 5), Array(6, 7))
var tempArr = ArrayBuffer[Double]()

例如,我想乘以arr_one和arr_two。

迭代 1:Array(1*2+2*3, 1*4 +2*5, 1*6+2*7 )分配给 tempArr

迭代 2:Array(3*2+4*3, 3*4 +4*5, 3*6+4*7)分配给 tempArr

迭代 3:Array(5*2+6*3, 5*4 +6*5, 5*6+6*7)分配给 tempArr

我知道如果

val x = Array(1, 2) ; val y = Array(Array(2,3), Array(4, 5), Array(6, 7))

我可以使用y map {x zip _ map{case(a, b) => a * b} sum}

但是如果x喜欢arr_one形式,我不知道如何使用for loop or something else来做到这一点。

我真的有想法。

如何在 scala 中执行此操作?

真的谢谢。

我相信这可以满足您的需求,没有任何可变状态和"迭代" - 它使用"用于理解"语法,这是一种非命令性的 for 循环 - 换句话说,它不是在每次迭代中更改状态,而是返回一个值,该值是每个"迭代"的结果序列:

val result: Array[Array[Int]] = for (arr1 <- arr_one) yield {
  for (arr2 <- arr_two) yield multArrays(arr1, arr2)
}

假设multArrays具有以下签名:

def multArrays(arr1: Array[Int], arr2: Array[Int]): Int

这将计算每个单元格的值。一个朴素的实现(假设数组的大小为 2)将是:

def multArrays(arr1: Array[Int], arr2: Array[Int]): Int = {
  arr1(0) * arr2(0) + arr1(1) * arr2(1)
}

但当然,这可以推广到任何大小的数组。

也许这就是你需要的:

val tmp = arr_one map ((arr1) => {arr_two map (arr2 => (arr1 zip arr2) map {case(a, b) => a * b} reduce (_ + _))} )

要获得ArrayBuffer只需使用:

tmpArr = tmp.toBuffer

最新更新