r - 在 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
推荐阅读
- angular - html中的角度通配符字符串比较
- css - 如何在 div 旁边显示 ngx-timepicker-field timepicker,而不是将其显示为弹出窗口
- c# - 如何在具有多个 IP 地址的服务器上从特定源 IP 地址发出 HTTP 请求?
- excel - 使用 Sheets.delete 时 Excel VBA 索引超出范围
- ios - 如何将字符串转换为字典 iOS Objective C
- python - 尝试使用 PythonAnyWhere 部署 Web Flask 应用程序时出现 WSGI 错误
- javascript - 如何在javascript中添加延迟
- django - 如何用 django 建立会话形式?
- javascript - Word Web-Addin:getSliceAsync() 只返回第一片数据
- r - 根据日期将数据框拆分为行