使用x,y坐标更新scala breeze矩阵(不是行和列的长度)

时间:2017-02-07 02:24:07

标签: scala scala-breeze

我是Scala的新手(Python背景),并尝试为我的稀疏数据实现四叉树,并尝试使用Breeze这样做(尽管如果你有更好的建议,我会'我完全开放)。

我的问题是这样的:我需要知道如何在(x,y)处更新矩阵而不通过i <- 0 until matrix.rows递归,因为我没有所有行和列的值,I只有特定的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)

假设我以零(@ {1}})矩阵开头,我如何使用DenseMatrix.zeros(6,6)points而不是xs来插入ys.rows

我试过这个: (其中.cols是一个6x6的零矩阵)

emptym

给了我各种错误:/

我在想也许我可以用某种val matrix = for { | x <- xs | y <- ys | p <- points | } yield (emptym(x.toInt,y.toInt) = p) 函数做到这一点,因为我想为此返回一个val,但我已经足够scala了,我不知道怎么做这个。

请帮我解决这个问题。谢谢! :)

编辑 - 理想情况下,我希望有更多的FP解决方案,不必循环遍历矩阵并进行更新。我想创建一个新矩阵。我正在考虑这样的事情,但无法让它发挥作用:

map

1 个答案:

答案 0 :(得分:1)

您可以使用更新方法,您可以在其中传递行号,列号和值以更新矩阵中的单元格:

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