2015-02-26 12 views
10

Potrzebuję wstawić wektor po przekątnej do macierzy w dowolnym miejscu. Wiem, jak wstawić wektor w pionie lub w poziomie, ale nie mogę tego zrobić po przekątnej.Jak wstawić wartości z wektora po przekątnej do macierzy w R?

mam:

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

pożądanego rezultatu (jeśli chcę wstawić wektora w pozycji A[3,2]), byłoby:

 [,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 

Również chcę móc wstawić wektor, aby uzyskać tę macierz (od 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 

Odpowiedz

4

Można użyć tej funkcji:

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 
} 

Kilka przykładów użycia:

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

Oto jedna z możliwości (prawdopodobnie można owinąć go do funkcji)

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 

Za drugie wyjście (Zakładając A macierz jest wszystko NA s ponownie)

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

Eleganckie rozwiązanie! Oto odpowiednia funkcja: wypełnienie <- function (A, b, i, j, up = FALSE) { k <- seq_along (b) - 1 # utwórz indeks A [cbind (i + ifelse (up, - 1, 1) * k, j + k)] <- b powrót (A) } wypełnienie (A, b, 3, 2) wypełnienie (A, b, 4, 1, PRAWDA) –

Powiązane problemy