【问题标题】:creating matrix of a special form and an out of bound error in R在 R 中创建特殊形式的矩阵和越界错误
【发布时间】:2021-09-13 02:10:40
【问题描述】:

我有一个长度为 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)]

}

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


我对 5*5 简单矩阵进行了尝试,并且成功了。但我没有得到我的循环代码的结果。请问有什么想法或提示吗?

【问题讨论】:

    标签: r matrix error-handling


    【解决方案1】:

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

    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
    

    【讨论】:

    • 效果很好!但是,知道为什么我在 i in 1:k 循环中重复它时我的代码不起作用吗?
    • 嵌套循环中有两个问题。首先触发错误,因为您在开始新矩阵时没有重置 f f <- 1 行应该在for(i in 1:k){ 之后的外循环内。其次,您不打印任何结果或保存每个矩阵,因此在代码完成后,您只有最后一个矩阵存储在mat。
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2016-05-22
    • 2021-10-04
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多