2016-04-28 74 views
0

这里是一个新手。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。例如

Iteration1: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

Iteration3: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中做到这一点?

真的很感谢。

+0

恰好迭代之间的tempArr什么?你是否在迭代中使用它,或者你是否将它与tempArr的前一个值结合起来? – Mifeet

回答

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 
1

我相信这样做你需要什么,没有任何可变状态和“迭代” - 它使用了“for-comprehension”语法这是一种非必要的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) 
} 

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

+0

哦,刚刚意识到你对'Array [Double]'形式的结果感兴趣 - 但不清楚应该应用什么逻辑来获得它。希望答案有帮助,也许你可以找出其余的......如果你需要的是标准矩阵乘法,这里有一个很好的(虽然不是微不足道的)实现:https://rosettacode.org/wiki/Matrix_multiplication#Scala –

+0

我知道了。谢谢你帮助我。 –