创建并填充上三角矩阵与向量在R

cgh8pdjw  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(99)

我需要创建一个方阵的基础上的可变长度的向量,其中向量的索引只填充上三角形,而不循环向量元素。
我试了下面的R代码:

# example vector (could be longer or shorter!)
v <- letters[1:8]
# calculate dimensions of square matrix
n <- ceiling((-1 + sqrt(1 + 8 * length(v))) / 2)
# create empty matrix
m <- matrix(NA, nrow=n, ncol=n)
# populate the matrix
m[lower.tri(m, diag=TRUE)] <- 1:length(v)
m <- t(m)

字符串
得到的矩阵看起来是这样的:

[,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   NA    5    6    7
[3,]   NA   NA    8    1
[4,]   NA   NA   NA    2


如何填充矩阵,使上三角形的那部分不需要循环向量索引元素?

[,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   NA   NA    5    6
[3,]   NA   NA   NA    7
[4,]   NA   NA   NA    8

  • 无载体元件回收
  • 使用正方形矩阵的完整维度(列/行)(最大化左下角的“NA块”)

谢谢你的帮助!

u0njafvf

u0njafvf1#

像这样的吗

f <- function(v) {
  n <- length(v)
  # number of rows of the square matrix
  m <- ceiling(sqrt(0.25 + 2*n) - 0.5)
  x <- array(NA, rep(m, 2))
  s <- pmin(m + 1L - row(x), col(x)) + pmax(m + 1L - row(x), col(x))/n + (m + 1L)*upper.tri(x)
  x[sort(order(s)[1:n])] <- v
  t(x)
}

字符串
测试长度为14的向量:

lapply(1:14, \(i) f(1:i))
#> [[1]]
#>      [,1]
#> [1,]    1
#> 
#> [[2]]
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]   NA   NA
#> 
#> [[3]]
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]   NA    3
#> 
#> [[4]]
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]   NA   NA    4
#> [3,]   NA   NA   NA
#> 
#> [[5]]
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]   NA   NA    4
#> [3,]   NA   NA    5
#> 
#> [[6]]
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]   NA    4    5
#> [3,]   NA   NA    6
#> 
#> [[7]]
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]   NA   NA   NA    5
#> [3,]   NA   NA   NA    6
#> [4,]   NA   NA   NA    7
#> 
#> [[8]]
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]   NA   NA    5    6
#> [3,]   NA   NA   NA    7
#> [4,]   NA   NA   NA    8
#> 
#> [[9]]
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]   NA    5    6    7
#> [3,]   NA   NA   NA    8
#> [4,]   NA   NA   NA    9
#> 
#> [[10]]
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]   NA    5    6    7
#> [3,]   NA   NA    8    9
#> [4,]   NA   NA   NA   10
#> 
#> [[11]]
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    2    3    4    5
#> [2,]   NA   NA    6    7    8
#> [3,]   NA   NA   NA   NA    9
#> [4,]   NA   NA   NA   NA   10
#> [5,]   NA   NA   NA   NA   11
#> 
#> [[12]]
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    2    3    4    5
#> [2,]   NA   NA    6    7    8
#> [3,]   NA   NA   NA    9   10
#> [4,]   NA   NA   NA   NA   11
#> [5,]   NA   NA   NA   NA   12
#> 
#> [[13]]
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    2    3    4    5
#> [2,]   NA    6    7    8    9
#> [3,]   NA   NA   NA   10   11
#> [4,]   NA   NA   NA   NA   12
#> [5,]   NA   NA   NA   NA   13
#> 
#> [[14]]
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    2    3    4    5
#> [2,]   NA    6    7    8    9
#> [3,]   NA   NA   NA   10   11
#> [4,]   NA   NA   NA   12   13
#> [5,]   NA   NA   NA   NA   14

qqrboqgw

qqrboqgw2#

也许你可以试试

t(
    replace(
        m,
        t(!is.na(cbind(rbind(replace(
            matrix(1, n - 1, n - 1),
            seq(n^2 - length(v)), NA
        ), 1), 1)[n:1, ])),
        seq_along(v)
    )
)

字符串
这给了

[,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]   NA   NA    5    6
[3,]   NA   NA   NA    7
[4,]   NA   NA   NA    8

1wnzp6jl

1wnzp6jl3#

选择一个非递增整数n-向量x,使得1 <= x <= n:1且sum(x)等于length(v)。x[i]表示结果矩阵的第i行中非NA元素的数量。
我们通过使用CVXR来形成凸优化问题,使得任何可行值都可以提供。当定义下面的问题时,xval是产生的x的最终值。它找到的解是c(4,2,1,1),但由于问题没有很好地定义,c(3,2,2,1)将是另一个有效的解,如果需要进一步约束解,我们可以添加额外的约束。
给定xval,形成逻辑矩阵m,其类似于结果的转置,并使用TRUE显示哪些条目是非NA的。由于R逐列存储矩阵,因此更容易填充转置。最后填充它,然后转置得到结果M。

v <- letters[1:8]
n <- ceiling((-1 + sqrt(1 + 8 * length(v))) / 2)

library(CVXR)
x <- Variable(n, integer = TRUE)
objective <- Minimize(0)
constraints <- list(sum(x) == length(v), diff(x) <= 0, x >= 1, x <= n:1)
problem <- Problem(objective, constraints)
soln <- solve(problem)
xval <- as.integer(soln$getValue(x) + 0.01)
xval
## [1] 4 2 1 1

m <- matrix(NA, n, n)
m[sapply(c(xval), function(i) rep(c(F, T), c(n-i, i)))] <- seq_along(v)
M <- t(m)

M
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]   NA   NA    5    6
## [3,]   NA   NA   NA    7
## [4,]   NA   NA   NA    8

字符串

相关问题