1

我对 mllib.linalg 中使用的 RDD 存在哲学问题。在数值线性代数中,人们想使用可变数据结构,但由于在 Spark 中一切(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)

依次思考,我想访问/更新xkby的第一列x0,通常在 scala/breeze 中由 完成xk(::, 0) := x0,其他列由

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

但是在mllib.linalg.Matrices中没有为它定义(应用喜欢!)方法。是否只是针对不变性访问列(行)?如果我使用RowMatrix怎么办?那我可以访问/更新行吗?

我的矩阵可以是本地的(如上)或分布式的,我想知道一般情况下,上述过程是否可以以功能方式完成。

我将不胜感激任何评论或帮助。

4

1 回答 1

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]())
}
于 2015-07-02T05:22:02.833 回答