在R中,将向量按行转换为上三角矩阵

12

我有一个向量,比如说

a = c(1,2,3,4,5,6) 

我希望将它们按行排列成一个上三角矩阵(不考虑对角线元素,它们都是零)。我的目标是得到以下矩阵:

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

但我通常会采用以下方法:将对角线元素替换为向量,但按列分配值。例如:

b= matrix(0, 4, 4)
b[upper.tri(b, diag=FALSE)]=a 

它将给我以下矩阵

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

原因在于当 R 给矩阵分配值时,默认情况下,它将按列进行分配。我想知道是否有一种简单的方法可以解决我的问题,而不必编写 for 循环。

我之前找到过一个与我的问题相关的类似帖子,但它没有解释如何按行分配值到上三角矩阵:

创建上三角矩阵

提前致谢!

3个回答

17
这里有一个选项。
b[lower.tri(b, diag=FALSE)] <- a
b <- t(b)
b
#      [,1] [,2] [,3] [,4]
# [1,]    0    1    2    3
# [2,]    0    0    4    5
# [3,]    0    0    0    6
# [4,]    0    0    0    0

或者,根据需要重新排列a并将其分配到右上角三角形中:

ut <- upper.tri(b, diag=FALSE)
b[ut] <- a[order(row(ut)[ut], col(ut)[ut])]
b
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    3
[2,]    0    0    4    5
[3,]    0    0    0    6
[4,]    0    0    0    0

0
请注意,要填充一个ASYMMETRIC矩阵,您可以首先通过上面显示的代码填充上三角形,然后使用不同的向量填充下三角形(无需转置)。
  c <- c(7,8,9,10,11,12)
  b[lower.tri(b, diag=FALSE)] <- c

0

尝试实现此操作,而不使用lower.tri():

matFill <- function(vec,mat_size=4,side='right'){
  if(side=='right'){ ridx=1;cidx=2
  } else if(side=='left'){ ridx=2;cidx=1 }
  
  b <-mat_size #ceiling(length(vec)/2)+1 #matrix size
  idx <- t(combn(1:4, 2))
  #or by hand:
  idx <- matrix(NA,factorial(b)/(factorial(b-2)*factorial(2)),2)
  o <- 0
  for(i in 1:(b-1)){ #i<-2
    idx[(o+1):(o+b-i),1] <- i
    idx[(o+1):(o+b-i),2] <- (i+1):b
    o <- o+b-i
  }
  #fill matrix
  mat <- matrix(0,b,b)
  for(x in 1:length(vec)){
    mat[idx[x,ridx],idx[x,cidx]] <- vec[x]
  }
  return(mat)
}


matFill(1:6)
matFill(1:10,5,'left')
matFill(1:14,6)

我无法弄清如何使用提供的向量确定矩阵的大小...


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