2017-02-24 2 views
0

Ich bringe thermische Bilder in R als 480 X 640 Matrizen. Nach dem Isolieren meines "Signals" (Sämlinge in einem Feld) möchte ich Werte in eine data.table exportieren, während ich auch Zeile und Spalte jeder Beobachtung notiere. Ich brauche eine final data.table mit im Wesentlichen x, y, z Informationen. Ich zeichne die rohen thermischen Matrizen als 3D-Oberfläche in rgl und würde gerne eine weitere 3D-Ebene in meinen Renderings machen, die mein "Signal" darstellt.Wie werden Werte und ihre jeweiligen Spalten-/Zeileninformationen aus einer Matrix für das 3D-Rendering extrahiert und aufgezeichnet?

So beginne ich mit Beispieldaten wie folgt:

library(data.table) 
library(rgl) 

dd <- data.table(c(1,0,1,2,1,0,2,1,0,2), 
       c(0,1,2,1,3,2,4,1,2,0), 
       c(3,2,1,3,2,4,3,2,1,0), 
       c(2,1,0,2,1,3,2,3,1,1), 
       c(0,1,2,1,3,2,0,1,1,3)) 

bb <- as.matrix(dd) # save a copy for later 

find_signal = function(DT, max, min) { # inverse of Dowle's NA remover 
    for (j in seq_len(ncol(DT))) 
    set(DT,which(DT[[j]] < min),j,NA) 
    for (j in seq_len(ncol(DT))) 
    set(DT,which(DT[[j]] > max),j,NA) 
} 

find_signal(dd, 2.0001, 1.9999) 

So, jetzt, nach Beseitigung der „Lärm“, mein data.table nur die Werte enthält, die zu meinem „Signal“ zu korrelieren. An diesem Punkt sieht es wie folgt aus:

V1 V2 V3 V4 V5 
1: NA NA NA 2 NA 
2: NA NA 2 NA NA 
3: NA 2 NA NA 2 
4: 2 NA NA 2 NA 
5: NA NA 2 NA NA 
6: NA 2 NA NA 2 
7: 2 NA NA 2 NA 
8: NA NA 2 NA NA 
9: NA 2 NA NA NA 
10: 2 NA NA NA NA 

Ich arbeite, wie diese Werte zu exportieren, während ihre jeweilige Position im Wärmebild aufgezeichnet wird. Ich muss jede Beobachtung und die entsprechenden Zeilen- und Spalteninformationen in eine andere data.table exportieren. Der Zweck davon ist, eine weitere Schicht in der Szene und weitere Analyse, wie euklidische Abstandsberechnungen zu rendern.

Die hypothetische Ausgabe lautet wie folgt:

y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4) 
x <- c(10,9,8,7,6,7,6,5,4,3,4,3,2,1) 
z <- c(2,2,2,2,2,2,2,2,2,2,2,2,2,2) 

aa <- data.table(x,y,z) 

Und würde wie folgt aussehen:

 x y z 
1: 10 1 2 
2: 9 2 2 
3: 8 3 2 
4: 7 4 2 
5: 6 5 2 
6: 7 1 2 
7: 6 2 2 
8: 5 3 2 
9: 4 4 2 
10: 3 5 2 
11: 4 1 2 
12: 3 2 2 
13: 2 3 2 
14: 1 4 2 

Erlauben Sie mir eine rgl Szene wie ein mit dem folgenden Code gerendert zu erstellen:

xb <- c(1:nrow(bb)); yb <- c(1:ncol(bb)) 

persp3d(x= xb, y= yb, z= bb, col = "blue")+ 
lines3d(aa$x[1:5], aa$y[1:5], z= z+1, col = "green", lwd = 5)+ # my signal 
lines3d(aa$x[6:10], aa$y[6:10], z= z+1,col = "green", lwd = 5)+ 
lines3d(aa$x[11:14], aa$y[11:14], z= z+1, col = "green", lwd = 5) 

Wie kann ich wieder Werte exportieren? aus einer Datentabelle (oder Matrix), während gleichzeitig die Spalten- und Zeilennummer für jeden Wert aufgezeichnet wird?

Vielen Dank für Beratung

+0

diese könnten hilfreich sein: http://stackoverflow.com/questions/10555210/r-convert-matrix-or-data-frame-to-sparsematrix und http://stackoverflow.com/questions/21099612/extract- i-and-j-from-a-sparse-Matrix – chinsoon12

+0

@ chinsoon12 Vielen Dank ... der verlinkte Inhalt sieht vielversprechend aus –

Antwort

1

Sie den Index jeden Eintrag der Matrix unter Verwendung der row() und col() Funktionen finden kann. So für Ihr Beispiel:

keep <- !is.na(bb) 
cbind(x = row(bb)[keep], y = col(bb)[keep], z = bb[keep] ) 

die diese Ausgabe erzeugt:

 x y z 
[1,] 4 1 2 
[2,] 7 1 2 
[3,] 10 1 2 
[4,] 3 2 2 
[5,] 6 2 2 
[6,] 9 2 2 
[7,] 2 3 2 
[8,] 5 3 2 
[9,] 8 3 2 
[10,] 1 4 2 
[11,] 4 4 2 
[12,] 7 4 2 
[13,] 3 5 2 
[14,] 6 5 2 

Es ist nicht in der gewünschten Reihenfolge gefragt; Verwenden Sie order(), wenn das wichtig ist.

Verwandte Themen