如何将向量中的值沿对角线插入 R 中的矩阵?
How to insert values from a vector diagonally into a matrix in R?
我需要在矩阵的任意位置对角线插入一个向量。我知道如何垂直或水平插入矢量,但不能沿对角线插入。
我有:
A <- matrix(nrow=6,ncol=6)
b <- c(1:4)
期望的结果(如果我想在位置 A[3,2]
中插入向量)将是:
[,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
另外,我希望能够插入向量来得到这个矩阵(从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
这是一种可能性(您可以将其包装成一个函数)
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
对于你的第二个输出(假设 A
矩阵又是 NA
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
您可以使用这个功能:
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
}
一些使用示例:
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
我需要在矩阵的任意位置对角线插入一个向量。我知道如何垂直或水平插入矢量,但不能沿对角线插入。
我有:
A <- matrix(nrow=6,ncol=6)
b <- c(1:4)
期望的结果(如果我想在位置 A[3,2]
中插入向量)将是:
[,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
另外,我希望能够插入向量来得到这个矩阵(从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
这是一种可能性(您可以将其包装成一个函数)
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
对于你的第二个输出(假设 A
矩阵又是 NA
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
您可以使用这个功能:
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
}
一些使用示例:
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