Обновление матрицы бриза scala для точки с координатами x, y (НЕ длина строк и столбцов)

Я новичок в Scala (фон Python) и пытаюсь реализовать Quadtree для своих разреженных данных и пытаюсь использовать Breeze для этого (хотя, если у вас есть лучшее предложение, я полностью открыт для него).

Моя проблема заключается в следующем: мне нужно знать, как обновить матрицу в (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)

person SnarkShark    schedule 07.02.2017    source источник


Ответы (1)


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

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
person Psidom    schedule 07.02.2017
comment
Спасибо за ответ!! Я попробовал, и это сработало :). Этот ответ сработал, но он довольно повторяющийся, и я ищу более функциональный вариант программирования. Как вы думаете, это просто невозможно сделать с помощью scala breeze? - person SnarkShark; 07.02.2017