2016-04-22 42 views
2

我是scala中的新手。scala中的多維數組拉鍊數組

我有兩個陣列,如:

val one = Array(1, 2, 3, 4) 
val two = Array(4, 5, 6, 7) 
var three = one zip two map{case(a, b) => a * b} 

這沒關係。

但我有一個多維數組和一維數組現在,像這樣:

val mulOne = Array(Array(1, 2, 3, 4),Array(5, 6, 7, 8),Array(9, 10, 11, 12)) 
val one_arr = Array(1, 2, 3, 4) 

我想他們乘法,我怎麼能做到這一點在Scala呢?

在此先感謝。

+0

你想要你的輸出是什麼? –

+0

1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 5 * 1 + 6 * 2 + 7 * 3 + 8 * 4 ..... –

回答

2

你可以使用:

val tmpArr = mulOne.map(_ zip one_arr).map(_.map{case(a,b) => a*b}) 

這會給你Array(Array(1*1, 2*2, 3*3, 4*4), Array(5*1, 6*2, 7*3, 8*4), Array(9*1, 10*2, 11*3, 12*4))

這裏mulOne.map(_ zip one_arr)mulOne每個內部陣列映射與對應的one_arr元素來創建對象:Array(Array((1,1), (2,2), (3,3), (4,4)), ..):我已經使用佔位符語法)。在接下來的步驟.map(_.map{case(a,b) => a*b})乘對中的每個元素給 輸出,如:Array(Array(1, 4, 9, 16),..)

那麼你可以使用:

tmpArr.map(_.reduce(_ + _)) 

讓所有內部Array S的總和來獲得Array(30, 70, 110)

+0

真誠地感謝您的回答 –

2

嘗試此

mulOne.map{x => (x, one_arr)}.map { case(one, two) => one zip two map{case(a, b) => a * b} } 

mulOne.map{x => (x, one_arr)} =>對於每個陣列內mulOne,創建一個元組與one_arr的內容。

.map { case(one, two) => one zip two map{case(a, b) => a * b} }基本上是您在第一個示例中對第一步中創建的每個元組執行的操作。

+0

對我也有幫助。 謝謝 –

1

使用對於這樣的理解,

val prods = 
    for { xs <- mulOne 
     zx = one_arr zip xs 
     (a,b) <- zx 
     } yield a*b 

等等

prods.sum 

提供最終結果。