在R中按行到上三角矩阵的向量

hsvhsicv  于 2023-06-03  发布在  其他
关注(0)|答案(3)|浏览(150)

我有一个向量说

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循环。
我发现了一个类似的帖子之前与我的问题,但它没有解释赋值给一个上三角矩阵的行:
creating a triangular matrix
先谢谢你了!

42fyovps

42fyovps1#

这里有一个选择

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
sbdsn5lh

sbdsn5lh2#

请注意,要填充一个非对称矩阵,您可以首先通过上面所示的代码填充上面的三角形,然后用一个不同的向量(不需要转置)填充下面的三角形。

c <- c(7,8,9,10,11,12)
  b[lower.tri(b, diag=FALSE)] <- c
ki0zmccv

ki0zmccv3#

尝试在不使用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)

我不知道如何使用提供的向量来确定矩阵的大小。

相关问题