2017-03-27 5 views
1

Ich versuche, herauszufinden, wie man eine neue Matrix erstellen mit allen Diagonalen Spalt wise.For Beispiel angeordnet sagen, dass ich Diagonalenordnet alle Diagonalvektoren in einer bestimmten Matrix

0 1 2 7 0 0 0 0 
0 0 3 6 7 0 0 0 
0 0 0 3 1 7 0 0 
0 0 0 0 4 4 7 0 
0 0 0 0 0 5 8 7 
0 0 0 0 0 0 1 8 
0 0 0 0 0 0 0 4 
0 0 0 0 0 0 0 0 

Extrahierung aus der folgenden Matrix habe wir bekommen,

1 3 3 4 5 1 4 
2 6 1 4 8 8 
7 7 7 7 7  

Nun, ich für eine effiziente Lösung in R am searching diese Diagonalvektoren, so dass die resultierende Matrix

ist
1 2 7 
3 6 7 
3 1 7 
4 4 7 
5 8 7 
1 8 0 
4 0 0 
0 0 0 
zu arrangieren

Auch, um die umgekehrte Form, dh kleinste Diagonalen erste wie dies

0 0 0 
0 0 1 
0 2 3 
7 6 3 
7 1 4 
7 4 5 
7 8 1 
7 8 4 

zu erreichen I for-Schleife versucht hat, verwendet wird, aber diese Lösung ist nicht recheneffizient, da die Matrix groß sein kann (10^3) Ich denke, die effiziente Lösung wird lächerlich einfach sein, aber ich kann es nicht herausfinden.

+0

Wie haben Sie "extrac t off "die Diagonalen? – yeedle

+0

durch Auswahl aller Nicht-Null-Diagonalen mit dieser Antwort http://stackoverflow.com/a/27935808/5273845 – Mkty

+0

Wie bestimmen Sie, welche nicht Null ist? – yeedle

Antwort

2

Sie die Matrix Teilmenge nacheinander und extrahieren die Diagonalelemente

sapply(0:2, function(i) 
      diag(m[-(nrow(m):(nrow(m)-i)), -(1:(1+i))])[1:nrow(m)]) 
#  [,1] [,2] [,3] 
#[1,] 1 2 7 
#[2,] 3 6 7 
#[3,] 3 1 7 
#[4,] 4 4 7 
#[5,] 5 8 7 
#[6,] 1 8 NA 
#[7,] 4 NA NA 
#[8,] NA NA NA 

ODER

m2 = t(m)[which(t(m) != 0)] 
m2 = append(m2, m2[length(m2)]) 
m2[length(m2) - 1] = NA 
m2[(length(m2)+1):(NROW(m)*3)] = NA 
matrix(m2, ncol = 3, byrow = TRUE) 
#  [,1] [,2] [,3] 
#[1,] 1 2 7 
#[2,] 3 6 7 
#[3,] 3 1 7 
#[4,] 4 4 7 
#[5,] 5 8 7 
#[6,] 1 8 NA 
#[7,] 4 NA NA 
#[8,] NA NA NA 

DATA

m = structure(c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 
3, 0, 0, 0, 0, 0, 0, 7, 6, 3, 0, 0, 0, 0, 0, 0, 7, 1, 4, 0, 0, 
0, 0, 0, 0, 7, 4, 5, 0, 0, 0, 0, 0, 0, 7, 8, 1, 0, 0, 0, 0, 0, 
0, 7, 8, 4, 0), .Dim = c(8L, 8L)) 
+0

Können Sie bitte einen effizienteren oder schnelleren Weg vorschlagen, da es immer noch quadratisch zur Anzahl der Elemente der Matrix ist? Können wir die Tatsache ausnutzen, dass die Matrix meist spärlich ist mit nicht diagonalen Elementen nahe der Hauptdiagonalen. Danke im Voraus! – Mkty

+0

Auch können wir den Vektor von Nicht-Null-Elementen wie (1,2,3,7,6,3,7,1,4 und so weiter) in der gegebenen Matrix erhalten. – Mkty

+0

@Mkty, für die zweite Frage sollte einer von 'which (t (m)! = 0)' oder 'which (m! = 0)' funktionieren. –

0

Ich denke, die einfachste Methode ist, den sparseMatrix zu verwenden Format, wo die Nicht-ze ro-Einträge werden im Objekt durch ihre Position (i) und die Position der Spalte (j) und die Werte (x) definiert, die sie einnehmen. Von diesem ist es leicht, von einer Spaltenmatrix von den Diagonalen abzusteigen. Eine for Schleife ist hier auch schnell (er), aber vielleicht etwas schwieriger zu verallgemeinern.

Daten

m = structure(c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 
3, 0, 0, 0, 0, 0, 0, 7, 6, 3, 0, 0, 0, 0, 0, 0, 7, 1, 4, 0, 0, 
0, 0, 0, 0, 7, 4, 5, 0, 0, 0, 0, 0, 0, 7, 8, 1, 0, 0, 0, 0, 0, 
0, 7, 8, 4, 0), .Dim = c(8L, 8L)) 

Vereinbaren Matrix

b = 3 # Set width of band 
n = nrow(m) 

library(Matrix) 

sm <- as(m, "TsparseMatrix") 

sparseMatrix(i = [email protected]+1, 
      j = [email protected] - [email protected], 
      x = [email protected], 
      dims = c(nrow(sm),b)) 
#8 x 3 sparse Matrix of class "dgCMatrix" 

#[1,] 1 2 7 
#[2,] 3 6 7 
#[3,] 3 1 7 
#[4,] 4 4 7 
#[5,] 5 8 7 
#[6,] 1 8 . 
#[7,] 4 . . 
#[8,] . . . 

eine for-Schleife durch jede Diagonale Mit schneller sein, aber Ich denke, der sparseMatrix Ansatz ein bisschen mehr ist allgemein

out = matrix(0, n, b) 
for(i in 1:b) { 
     ro = 1:(n-i) 
     co = (1+i):n 
     out[ro, i] = m[cbind(ro, co)] 
    } 
    out 
#  [,1] [,2] [,3] 
#[1,] 1 2 7 
#[2,] 3 6 7 
#[3,] 3 1 7 
#[4,] 4 4 7 
#[5,] 5 8 7 
#[6,] 1 8 0 
#[7,] 4 0 0 
#[8,] 0 0 0 
+0

Diese Antwort ist v. Ähnlich der Antwort [hier] (http: // stackoverflow.com/questions/43173211/schneller-alternative-zu-berechnen-colcumsums-of-a-band-matrix/43185310 # 43185310) aber hinzugefügt, da die Frage ganz anders formuliert ist. – user20650

Verwandte Themen