2015-02-26 4 views
10

Ich muss einen Vektor diagonal in eine Matrix an einer beliebigen Stelle einfügen. Ich weiß, wie man einen Vektor vertikal oder horizontal einfügt, aber ich kann es nicht diagonal tun.Wie fügt man Werte aus einem Vektor diagonal in eine Matrix in R ein?

ich habe:

A <- matrix(nrow=6,ncol=6) 
b <- c(1:4) 

das gewünschte Ergebnis (wenn ich den Vektor in der Position A[3,2] eingefügt werden soll), wäre:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] NA NA NA NA NA NA 
[2,] NA NA NA NA NA NA 
[3,] NA 1 NA NA NA NA 
[4,] NA NA 2 NA NA NA 
[5,] NA NA NA 3 NA NA 
[6,] NA NA NA NA 4 NA 

Auch ich möchte in der Lage zu einfügen der Vektor diese Matrix zu erhalten (ausgehend von A[4,1]):

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] NA NA NA 4 NA NA 
[2,] NA NA 3 NA NA NA 
[3,] NA 2 NA NA NA NA 
[4,] 1 NA NA NA NA NA 
[5,] NA NA NA NA NA NA 
[6,] NA NA NA NA NA NA 

Antwort

4

können Sie diese Funktion verwenden:

insert.diag <- function(A,b,start=c(1,1),dir=c(1,1)) { 
    sq <- seq_along(b)-1 
    indices <- sapply(1:2,function(i) start[i] + dir[i]*sq) 
    stopifnot(all(indices>0)) 
    stopifnot(all(indices[,1]<=nrow(A))) 
    stopifnot(all(indices[,2]<=ncol(A))) 
    A[indices] <- b 
    A 
} 

Einige Anwendungsbeispiele:

A <- matrix(nrow=6,ncol=6) 
b <- c(1:4) 

> insert.diag(A,b,c(1,6),c(1,-1)) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] NA NA NA NA NA 1 
[2,] NA NA NA NA 2 NA 
[3,] NA NA NA 3 NA NA 
[4,] NA NA 4 NA NA NA 
[5,] NA NA NA NA NA NA 
[6,] NA NA NA NA NA NA 
> insert.diag(A,b,c(6,6),c(-1,-1)) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] NA NA NA NA NA NA 
[2,] NA NA NA NA NA NA 
[3,] NA NA 4 NA NA NA 
[4,] NA NA NA 3 NA NA 
[5,] NA NA NA NA 2 NA 
[6,] NA NA NA NA NA 1 
> insert.diag(A,b,c(1,1),c(1,1)) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 NA NA NA NA NA 
[2,] NA 2 NA NA NA NA 
[3,] NA NA 3 NA NA NA 
[4,] NA NA NA 4 NA NA 
[5,] NA NA NA NA NA NA 
[6,] NA NA NA NA NA NA 
10

Hier ist eine Möglichkeit (Sie wahrscheinlich es einpacken könnten in eine Funktion)

indx <- 0:(length(b) - 1) # Create an index 

Frow <- 3 ; Fcol <- 2 #initiate rows/cols 
A[cbind(Frow + indx, Fcol + indx)] <- b 
A 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] NA NA NA NA NA NA 
# [2,] NA NA NA NA NA NA 
# [3,] NA 1 NA NA NA NA 
# [4,] NA NA 2 NA NA NA 
# [5,] NA NA NA 3 NA NA 
# [6,] NA NA NA NA 4 NA 

Für Ihren zweiten Ausgang (Unter der Annahme A Matrix all NA wieder s)

Frow <- 4 ; Fcol <- 1 
A[cbind(Frow - indx, Fcol + indx)] <- b 
A 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] NA NA NA 4 NA NA 
# [2,] NA NA 3 NA NA NA 
# [3,] NA 2 NA NA NA NA 
# [4,] 1 NA NA NA NA NA 
# [5,] NA NA NA NA NA NA 
# [6,] NA NA NA NA NA NA 
+1

Elegante Lösung! Hier ist die entsprechende Funktion: füllen <- Funktion (A, b, i, j, oben = FALSE) { k <- seq_along (b) - 1 # erstellen Sie einen Index A [cbind (i + ifelse (oben, - 1, 1) * k, j + k)] <- b zurück (A) } füllen (A, b, 3, 2) füllen (A, b, 4, 1, WAHR) –

Verwandte Themen