2016-04-22 47 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 

提供最终结果。