2017-02-07 10 views
0

Я новичок в Scala (фон Python) и пытаюсь реализовать Quadtree для моих разреженных данных и пытаюсь использовать Breeze, чтобы сделать это (хотя, если у вас есть лучшее предложение, я полностью открыт для него).Обновление scala breeze матрицы для точки с координатами x, y (НЕ длина строк и столбцов)

Моя проблема заключается в следующем: мне нужно знать, как обновить матрицу в (x, y) без рекурсии через просто i <- 0 until matrix.rows, потому что у меня нет значений для всех строк и столбцов, у меня есть только конкретные xs и YS. Если это непонятно, вот что я имею в виду: В документации breeze, вы обычно видите что-то вроде этого

val r = new scala.util.Random(100) 
    for(i <-0 until Matrix.rows) 
     for(j <- 0 until Matrix.cols) 
      Matrix(i,j) = r.nextInt 
    return Matrix 

Это нормально, и денди, если бы я имел значение для каждого значения в матрице, но я этого не делаю. Вместо этого я работаю над чем-то вроде этого.

val points: Array[Double] = Array(3.0, 5.0, 8.0) 
val xs: Array[Double] = Array(2.0, 5.0, 6.0) 
val ys: Array[Double] = Array(3.0, 4.0, 6.0) 

, где я хочу matrix(2,3) = 3.0

Где я знаю, что моя матрица должна быть 6x6 матрица DenseMatrix[Double](6,6).

Предполагая, что я начинаю с матрицей нулей (DenseMatrix.zeros(6,6)), как я могу вставить мой points используя мой xs и ys, а не .rows и .cols?

Я попытался это: (где emptym является 6x6 матрица из нулей)

val matrix = for { 
    | x <- xs 
    | y <- ys 
    | p <- points 
    | } yield (emptym(x.toInt,y.toInt) = p) 

, который дает мне все виды ошибок:/

Я думал, может быть, я мог бы сделать это с некоторыми вид map функция, потому что я хочу вернуть val для этого, но я достаточно новый для scala, что я не могу понять, как это сделать.

Пожалуйста, помогите мне разобраться в этом. Благодаря! :)

Редактировать - В идеале я надеюсь на большее решение FP, которое не должно проходить через матрицу и обновлять ее. Я бы хотел создать новую матрицу. Я что-то вроде этого думать, но не могу заставить его работать:

val newMatrix = oldMatrix.map(xs, ys, points => oldMatirx(x,y) = point) 

ответ

1

Вы можете использовать метод обновления, где вы можете передать номер строки, номер Col и значение для обновления ячейки в матрице:

val mat = DenseMatrix.zeros[Double](6,6) 
for (i <- 0 until xs.length) { 
    mat.update(xs(i).toInt - 1, ys(i).toInt - 1, points(i)) 
} 

Печать матрица из:

for (i <- 0 until mat.rows){ 
    for(j <- 0 until mat.cols) { 
    print(mat(i, j) + " ") 
    } 
    println() 
} 

0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 3.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 5.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 8.0 
+0

Спасибо за ответ !! Я попробовал, и это сработало :). Этот ответ работал, но его довольно итеративно, и я ищу более функциональный вариант программирования. Неужели это просто невозможно сделать с помощью scala breeze, как вы думаете? – SnarkShark