2015-02-26 6 views
10

Bir vektörü rasgele bir yere matris içine yerleştirmem gerekiyor. Bir vektörü dikey veya yatay olarak nasıl ekleyeceğimi biliyorum ama bunu çapraz olarak yapamam.Bir vektörden çapraz olarak bir matrise matris içine değerler nasıl eklenir?

ben:

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

istenen sonucu (I konumu A[3,2] vektörü eklemek istiyorum) olacaktır: Aynı zamanda

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

ben eklemek mümkün istiyorum

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

cevap

4

Bu işlevi kullanabilirsiniz:

Kullanım
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 
} 

Bazı örnekler:

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

: vektör bu matrisi (A[4,1] başlayarak) elde etmek için İşte ikinci çıkışı için

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 

(muhtemelen bir fonksiyonu haline sarabilirdiniz) bir olasılık (A matrisi olduğunu varsayarsak tüm NA Tekrar)

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

Zarif çözüm! İşte işlevi: doldurma <- işlev (A, b, i, j, yukarı = YANLIŞ) { k <- seq_along (b) - 1 # dizin oluştur A [cbind (i + ifelse (yukarı, - 1, 1) * k, burada j + k)] <- dönüş (A) } dolgu (A, B, 3, b2) dolgu (A, B, 4, 1, TRUE) –

İlgili konular