2017-06-17 30 views
0

我正在使用spark與scala並嘗試執行以下操作。密集向量與空值的點積

我有兩個密集的矢量(使用Vectors.dense創建),我需要找到這些的點積。我怎麼能做到這一點?

另外,我正在創建基於輸入文件的逗號分隔的向量。但是有些值缺失。當我創建矢量時,是否有一種簡單的方法可以將這些值讀取爲零而不是空值?

例如:

輸入文件:3,1 ,,, 2

創建矢量:3,1,0,0,2

+0

歡迎堆棧溢出!請[參觀](http://stackoverflow.com/tour)以查看網站的工作原理和問題,並相應地編輯您的問題。另請參閱:[爲什麼「有人可以幫我嗎?」不是一個實際的問題?](http://meta.stackoverflow.com/q/284236) –

回答

0

火花載體可用於陣列只是包裝紙,內部他們會轉換爲Breeze陣列進行矢量/矩陣運算。你可以只是做手工來獲取點積:

import org.apache.spark.mllib.linalg.{Vector, Vectors, DenseVector} 
import breeze.linalg.{DenseVector => BDV, SparseVector => BSV, Vector => BV} 

val dv1: Vector = Vectors.dense(1.0, 0.0, 3.0) 
val bdv1 = new BDV(dv1.toArray) 

val dv2: Vector = Vectors.dense(2.0, 0.0, 0.0) 
val bdv2 = new BDV(dv2.toArray) 

scala> bdv1 dot bdv2 
res3: Double = 2.0 

關於第二個問題,你可以做這樣的事情:

val v: String = "3,1,,,2" 

scala> v.split("\\,").map(r => if (r == "") 0 else r.toInt) 
res4: Array[Int] = Array(3, 1, 0, 0, 2)