2017-02-07 41 views
0

我是Scala(Python背景)的新手,並試圖爲我的稀疏數據實現一個Quadtree,並試圖使用Breeze這樣做(儘管如果你有更好的建議,我完全接受它)。我需要知道如何在(x,y)處更新矩陣,而無需簡單地通過i <- 0 until matrix.rows遞歸,因爲我沒有所有行和列的值,我只有特定的xs和YS。如果這還不清楚這裏就是我的意思是:在breeze文檔,你通常會看到這樣的事情用x,y座標更新scala微風矩陣(不是行和列的長度)

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使用我xsys而不是.rows.cols

我已經試過這樣: (其中emptym是零的6×6矩陣)

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

這給了我各種錯誤:/

我想也許我可以做一些這樣做因爲我想爲此返回一個val,但是我足夠新到scala,因此我無法完全弄清楚如何做到這一點。

請幫我弄清楚這一點。謝謝! :)

編輯 - 理想情況下,我希望更多的FP解決方案,不必循環矩陣和更新它。我想創建一個新的矩陣。我想這樣的事情,但不能得到它的工作:

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

回答

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 
+0

感謝您的響應!!我試了一下,它工作:)。這個答案的工作,但它的迭代,我正在尋找更多的功能編程選項。這不能用scala微風來完成,你覺得呢? – SnarkShark