如何在R中将向量的值对角插入矩阵?

10

我需要将一个向量对角插入到矩阵中的任意位置。我知道如何在垂直或水平方向上插入向量,但是我无法斜向插入。

我有:

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
2个回答

10

这里有一个可能性(你可以将其封装成一个函数)

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

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
优雅的解决方案!以下是相应的函数: fill <- function(A, b, i, j, up = FALSE){ k <- seq_along(b) - 1 # 创建索引 A[cbind(i + ifelse(up, -1, 1) * k, j + k)] <- b return(A) }fill(A, b, 3, 2) fill(A, b, 4, 1, TRUE) - Andri Signorell

4
您可以使用这个函数:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接