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