2016-08-09 4 views
1

Ich schreibe eine Funktion, um eine Matrix zu erstellen, die die folgende Struktur hat. Das Wichtigste, was zu beachten ist, dass die Zeilen 2 bis 7 Wert der subdiagonal und 0 in allen anderen Spalten enthalten:Hinzufügen neuer Zeilen zu einer subdiagonalen Matrix in R unter Verwendung von Vektorwerten

0.00 0.00 0.00 0.00 0.00 0.50 0.50 
0.75 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.80 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.80 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.90 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.60 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.80 0.00 

Es gibt zwei Eingänge meine Funktion, x und y. Die erste Zeile wird durch den Vektor x so definiert, daß:

x <- c(0.00, 0.00, 0.00, 0.00, 0.00, 0.50, 0.50) 

I den zweiten Vektor verwenden möchte y den Rest der Matrix zu vervollständigen. Indem Sie den ersten Wert in R2 C1, den zweiten Wert in R3 C2, den dritten Wert in R4 C3 usw. verwenden, bis die Matrix vollständig ist, und dann alles andere mit Nullen füllen.

y <- c(0.75, 0.80, 0.80, 0.90, 0.60, 0.80, 0.00) 

Ich bin sicher, dass dies in R gelöst werden kann, vielleicht gibt es bereits eine Matrixfunktion diese Struktur oder ein for-Schleife zu definieren, verwendet werden könnte.

Ich kann die Funktion schreiben, erstellen Sie die Matrix und fügen Sie die erste Zeile (siehe unten), aber das nächste Bit ist etwas jenseits meiner aktuellen Fähigkeiten - die Funktion muss dynamisch sein - dh. die Werte von x und y und die Länge können sich ändern.

Jede Hilfe oder Zeiger von jemand würde ..

geschätzt werden (Dies ist, was ich bisher haben .... Ich weiß, es ist ein bisschen pathetisch ist)

matrix <- function (x, y) { 
    matrix <- x 

    matrix 
} 

Antwort

3

Hier ist ein Versuch, alle in ein Streich:

head(rbind(x, diag(y)),-1) 

Diese im Grunde aus y mit den Werten auf den diag onal eine quadratische Matrix schafft, drückt ihn durch eine Reihe nach unten durch rbind -ing x, dann löscht die zusätzliche Zeile von der Unterseite der neu erstellten Matrix.

Oder ein bisschen kreativer Indizierung row und col kann es auch tun:

m <- matrix(0,nrow=7,ncol=7) 
m[row(m)-col(m)==1] <- head(y,-1) 
m[1,] <- x 

Beide Rückkehr:

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
#[1,] 0.00 0.0 0.0 0.0 0.0 0.5 0.5 
#[2,] 0.75 0.0 0.0 0.0 0.0 0.0 0.0 
#[3,] 0.00 0.8 0.0 0.0 0.0 0.0 0.0 
#[4,] 0.00 0.0 0.8 0.0 0.0 0.0 0.0 
#[5,] 0.00 0.0 0.0 0.9 0.0 0.0 0.0 
#[6,] 0.00 0.0 0.0 0.0 0.6 0.0 0.0 
#[7,] 0.00 0.0 0.0 0.0 0.0 0.8 0.0 
+0

Ich mag, dass - sehr klug, ich nehme das alles in einem geh antwort! Danke für Ihre Hilfe. –

+0

Sie wollen vielleicht nicht Zeilennamen, also vielleicht 'unname (x)' in dieser ersten Zeile – shayaa

+1

@shayaa - Oder 'Kopf (rbind (x, diag (y), deparse.level = 0), - 1)' wenn Sie möchte das formale Argument verwenden, das das steuert. – thelatemail

Verwandte Themen