2015-06-27 80 views
1

我在使用mllib.linalg中的RDD時遇到了一些哲學問題。在數值線性代數中,人們想要使用可變數據結構,但是由於在Spark中所有的東西(RDDs)都是不可變的,所以我想知道是否有辦法解決這個問題,特別是在我處理的情況下。按順序更新矩陣RDD的列

import org.apache.spark.mllib.linalg._ 
import breeze.numerics._ 

val theta = constants.Pi/64 
val N = 1000 
val Gk: Matrix = Matrices.dense(2, 2, Array(
           cos(theta), sin(theta), 
           -sin(theta), cos(theta)) 
           ) 
val x0: Vector = Vectors.dense(0.0, 1.0) 
var xk = DenseMatrix.zeros(2, N + 1) 

按順序思維,我想通過

for (k <- 0 to N - 1) { 
    xk(::, k + 1) := Gk * xk(::, k) 
} 

但在訪問/通過x0,而正常情況下在斯卡拉/微風由xk(::, 0) := x0完成更新xk第一列和其他列mllib.linalg.Matrices沒有(適用於!)爲其定義的方法here。只是訪問一個列(行)反對不變性?如果我使用RowMatrix怎麼辦?我可以訪問/更新行嗎?

我的矩陣可以是本地的(如上)或分佈式和 我想知道在一般情況下,如果上面的方法可以在功能性的方式來完成。

我會很感激任何評論或幫助。

回答

1

到目前爲止,我已經爲我的幾個問題找到答案,儘管「哲學」問題依然存在。

首先,我發現我可以使用import breeze.linalg._來利用微風矩陣的數據可變性,但這可能不是完全以分佈的方式完成的。

其次,於上述循環功能的方法是當然的,尾遞歸這是如下

def nMultiply(x: Vector, M: Matrix, n: Int): Tuple2[Vector, Array[Double]] = { 
    def loop(acc: Vector, n: Int, store: Array[Double]): Tuple2[Vector, Array[Double]] = { 
     if (n <= 0) (acc, store) 
     else { 
      var res: Vector = M.multiply(loop(x, n - 1, store)._1) 
      (res, loop(x, n - 1, store)._2.union(res.toArray)) 
     } 
    } 
loop(x, n, Array[Double]()) 
}