0

因此,我正在尝试使用 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。

4

2 回答 2

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)))
于 2013-08-16T17:17:47.940 回答
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

这样,您无需进行任何计算即可填充下三角形。顺便说一句,1.99 是什么?这可能是一个更适合作为 C 程序提交的问题。Rcpp 包支持这一点,并且有很多关于 SO 的工作示例。也许搜索:[r] rcpp 嵌套循环

于 2013-08-16T17:01:26.477 回答