在 R 中创建特殊形式的矩阵和越界错误

creating matrix of a special form and an out of bound error in R

我有一个长度为 k 的向量,其中填充了参数 rho 的值。让这个向量命名为 rho.vec()
我想为向量 rho.vec().
的每个元素创建以下形式的多个矩阵

这是我的代码:

    mat<- matrix(0,n,n)
f=1
for(i in 1:k){
  for(ro in 1:n){
    for(co in 0:(n-f)){
      mat[ro,co+f]<- rho.vec[i]^co
    }
    f<- f+1
  }
mat[lower.tri(mat)] = t(mat)[lower.tri(mat)]

}

但我收到错误:[<-(*tmp*, ro, co + f, value = rho.vec[i]^co) 中的错误: 下标越界


我对 5*5 简单矩阵进行了尝试,它起作用了。但是我没有在这里得到我的循环代码的结果。请问有什么想法或提示吗?

这里有两种方法可以满足您的需求。一个生成包含矩阵的数组,另一个生成矩阵列表:

rho.vec <- c(.4, .5, .6, .7, .8, .9)
nrho <- length(rho.vec)
n <- 5
mat <- array(1, dim=c(n, n, length(rho.vec)))

这将设置一个数组,其中每一页都是一个矩阵:

for (i in seq(nrho)){
    low <- unlist(mapply(seq, 1, (n - 1):1))
    up <- unlist(mapply(seq, 1:(n - 1), 1))
    lower <- rho.vec[i]^low
    upper <- rho.vec[i]^up
    mat[, , i][lower.tri(mat[, , i])] <- lower
    mat[, , i][upper.tri(mat[, , i])] <- upper
}

这是 rho = .4 的第一页

mat[, , 1]
#        [,1]  [,2] [,3]  [,4]   [,5]
# [1,] 1.0000 0.400 0.16 0.064 0.0256
# [2,] 0.4000 1.000 0.40 0.160 0.0640
# [3,] 0.1600 0.400 1.00 0.400 0.1600
# [4,] 0.0640 0.160 0.40 1.000 0.4000
# [5,] 0.0256 0.064 0.16 0.400 1.0000

第二种方法创建一个函数,然后使用 lapply:

symm <- function(rho, n) {
    m <- matrix(1, n, n)
    low <- unlist(mapply(seq, 1, (n - 1):1))
    up <- unlist(mapply(seq, 1:(n - 1), 1))
    lower <- rho^low
    upper <- rho^up
    m[lower.tri(m)] <- lower
    m[upper.tri(m)] <- upper    
    return(m)
}

mat.list <- lapply(rho.vec, symm, n=n)
mat.list[[1]]
#        [,1]  [,2] [,3]  [,4]   [,5]
# [1,] 1.0000 0.400 0.16 0.064 0.0256
# [2,] 0.4000 1.000 0.40 0.160 0.0640
# [3,] 0.1600 0.400 1.00 0.400 0.1600
# [4,] 0.0640 0.160 0.40 1.000 0.4000
# [5,] 0.0256 0.064 0.16 0.400 1.0000