2016-04-28 45 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

我知道了。謝謝你幫助我。 –