所以我试图使用R来计算与高斯过程相关的相关矩阵,并希望在不使用我在下面写的三重for循环的情况下这样做的一些建议。主要是我想尝试压缩代码以实现可读目的,并加快计算速度。
#Example Data
n = 500
x1 = sample(1:100,n,replace=T)
x2 = sample(1:100,n,replace=T)
x3 = sample(1:100,n,replace=T)
X = cbind(x1,x2,x3)
R = matrix(NA,nrow=n,ncol=n)
for(i in 1:nrow(X)){
for(j in 1:nrow(X)){
temp = 0
for(k in 1:ncol(X)){
temp = -abs(X[i,k]-X[j,k])^1.99 + temp
}
R[i,j] = exp(temp)
}
}
因此当n
变大时,代码变得更慢。另外值得注意的是,由于这是一个相关矩阵,矩阵是对称的,对角线等于1.
答案 0 :(得分:2)
使用它会快得多:
y <- t(X)
R <- exp(-sapply(1:ncol(y), function(i) colSums((y-y[,i])^2)))
如果您想保留原始配方:
R <- exp(-sapply(1:ncol(y), function(i) colSums(abs(y-y[,i])^1.99)))
答案 1 :(得分:1)
我想知道你是否可以通过更改这两行来减少计算和循环次数? (实际上时间提高了50%以上14.304秒提高到了6.234秒)
1: for(j in 1:nrow(X)){
2: R[i,j] = exp(temp)
要:
1: for(j in i:nrow(X)){
2: R[i,j] = R[j,i]= exp(temp)
经过测试:
> all.equal(R, R2)
[1] TRUE
这样你就可以在不进行任何计算的情况下填充下三角形.BTW,1.99是什么?这可能是一个更适合作为C程序提交的问题。 Rcpp包支持这一点,在SO上有很多有用的例子。也许搜索:[r] rcpp嵌套循环