复算法R中的矢量化
我的代码多次调用下面的函数。我使用Rprof发现它占用了1/3的执行时间 我听说R可以通过矢量化变得更快。但是,我使用的算法访问两个不同列表中的两个索引,因此我不知道*ply函数如何工作 还有什么可以做的来优化它吗 n是整数,u和v是复数列表复算法R中的矢量化,r,performance,vectorization,R,Performance,Vectorization,我的代码多次调用下面的函数。我使用Rprof发现它占用了1/3的执行时间 我听说R可以通过矢量化变得更快。但是,我使用的算法访问两个不同列表中的两个索引,因此我不知道*ply函数如何工作 还有什么可以做的来优化它吗 n是整数,u和v是复数列表 psi <- function(n, u, v) { psi = complex(real = 0, imaginary = 0) for (i in 1 : (n - 1)) { for (j in (i
psi <- function(n, u, v)
{
psi = complex(real = 0, imaginary = 0)
for (i in 1 : (n - 1))
{
for (j in (i + 1) : n)
{
psi = psi + log(u[i] * v[j] - u[j] * v[i])
}
}
return (psi * 3)
}
psi如果我读对了你的代码,对于n=4的情况,你的总和归结为
log(u[1]*v[2] - u[2]*v[1]) +
log(u[1]*v[3] - u[3]*v[1]) +
log(u[1]*v[4] - u[4]*v[1]) +
log(u[2]*v[3] - u[3]*v[2]) +
log(u[2]*v[4] - u[4]*v[2]) +
log(u[3]*v[4] - u[4]*v[3])
这就是所有可能的n选择2的组合。您可以使用combn()
创建这样的索引列表
psi我相信下面的方法可能会解决您的问题。我之所以选择这种表达方式,是因为考虑到你已经做过的事情,我认为它是非常透明的。基本上,我只是预先生成了一个I和j的向量,并像你们一样使用它们,但同时作为向量(复制和粘贴你们的方程)
psi
psi <- function(n,u,v) {
mx <- function(p) {a<-p[1]; b<-p[2]; log(u[a]*v[b]-u[b]*v[a])}
sum(combn(n,2, FUN=mx)) * 3
}
psi <- function(n,u,v) {
j <- combn(n, 2) #I'll overwrite j later to conserve memory
i <- j[1,]
j <- j[2,]
sum(log(u[i] * v[j] - u[j] * v[i])) * 3
}
n <- 5
combn(n, 2)
for (i in 1 : (n - 1))
{
for (j in (i + 1) : n)
{
print(c(i, j))
}
}