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

时间:2016-04-28 09:00:01

标签: arrays scala operation

这里的新手。

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中执行此操作?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我相信这可以满足你的需要,没有任何可变的状态和#34;迭代" - 它使用" for-comprehension"语法是一种非命令性的循环 - 换句话说,在每次迭代中代替改变状态,它返回一个值,这是每个结果的序列"迭代":

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)
}

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

答案 1 :(得分:0)

可能这就是你需要的:

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

要获得ArrayBuffer,只需使用:

tmpArr = tmp.toBuffer