Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复算法R中的矢量化_R_Performance_Vectorization - Fatal编程技术网

复算法R中的矢量化

复算法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

我的代码多次调用下面的函数。我使用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 + 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))
    }
}