1

У меня возникают философские проблемы с RDD, используемыми в mllib.linalg. В числовой линейной алгебре хочется использовать изменчивую структуру данных, но поскольку в Spark все (RDD) неизменно, я хотел бы знать, есть ли способ обойти это, особенно для следующей ситуации, с которой я имею дело;Последовательное обновление столбцов матрицы 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) 

Последовательная мышление, я хотел бы получить доступ к/обновить первый столбец xk по x0, где обычно в Скале/ветер делается xk(::, 0) := x0, и другие столбцы по

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

, но в mllib.linalg.Матрисы там нет (применять как!) метод, определенный для него 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]()) 
} 
Смежные вопросы