首页 > 解决方案 > 在 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 简单矩阵进行了尝试,并且成功了。但我没有得到我的循环代码的结果。请问有什么想法或提示吗?

标签: rmatrixerror-handling

解决方案


这里有两种方法可以做你想做的事。一个产生一个包含矩阵的数组,另一个产生一个矩阵列表:

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

推荐阅读