2017-02-07 4 views
0

Ich bin neu in Scala (Python-Hintergrund) und versuche, einen Quadtree für meine spärlichen Daten zu implementieren und versuche, Breeze dafür zu verwenden (Obwohl, wenn Sie einen besseren Vorschlag haben, bin ich total offen dafür).Scala-Brise-Matrix für Punkt mit x, y-Koordinaten aktualisieren (keine Länge von Zeilen und Spalten)

Mein Problem ist das: Ich muss wissen, wie man eine Matrix bei (x, y) ohne rekursiv durch einfach i <- 0 until matrix.rows aktualisieren, weil ich nicht die Werte für alle Zeilen und Spalten habe, ich habe nur bestimmte xs und ys. Wenn dies unklar ist, hier ist was ich meine: In der breeze Dokumentation, die Sie normalerweise sehen so etwas wie diese

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 

Das ist schön und gut, wenn ich einen Wert für jeden Wert in der Matrix hatte, aber ich weiß nicht. Stattdessen arbeite ich mit so etwas.

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) 

wo ich matrix(2,3) = 3.0

wollen, wo ich weiß, dass meine Matrix eine 6x6 Matrix DenseMatrix[Double](6,6) sein sollte.

Unter der Annahme, dass ich mit einer Matrix aus Nullen beginnen (DenseMatrix.zeros(6,6)) wie kann ich mein einfügen points mit meinem xs und ys statt .rows und .cols?

Ich habe dies versucht: (wo emptym eine Matrix aus Nullen 6x6 ist)

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

, die mir alle Arten von Fehlern gibt:/

Ich dachte, vielleicht habe ich mit einigen dies tun könnte Art von map Funktion, weil ich ein val für das zurückgeben möchte, aber ich bin neu genug, um zu skalieren, dass ich kann nicht ganz herausfinden, wie dies zu tun ist.

Bitte helfen Sie mir, dies herauszufinden. Vielen Dank! :)

Bearbeiten - Im Idealfall hoffe ich auf eine FP-Lösung, die nicht durch die Matrix durchlaufen und aktualisieren muss. Ich möchte eine neue Matrix erstellen. Ich bin so etwas wie diese zu denken, aber es kann nicht an der Arbeit:

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

Antwort

1

Sie die Update Methode verwenden kann, wo Sie die Zeilennummer, col Nummer und den Wert übergeben können eine Zelle aktualisieren in der Matrix:

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)) 
} 

drucken Sie die Matrix aus:

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

Vielen Dank für die Antwort !! Ich habe es ausprobiert und es hat funktioniert :). Diese Antwort hat funktioniert, aber es ist ziemlich iterativ, und ich suche nach einer funktionelleren Programmieroption. Kann das nicht einfach mit Scala Breeze gemacht werden? – SnarkShark

Verwandte Themen