Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Python 执行双重求和的最佳方法_Python_Performance_Math_Sum - Fatal编程技术网

Python 执行双重求和的最佳方法

Python 执行双重求和的最佳方法,python,performance,math,sum,Python,Performance,Math,Sum,例如,假设易于执行十万次操作,我如何优化计算Gxx?如果我只是使用嵌套for循环来执行求和,则需要很长时间。有没有一种方法可以使用求和函数或其他方法来提高此过程的效率 作为参考,我当前的psuedo代码执行以下操作: rrange=range(r-(rows-1)/2,r+(rows-1)/2) crange=range(c-(cols-1)/2,c+(cols-1)/2) Gxx=0 for rval,cval in product(rrange,crange): #sum(

例如,假设易于执行十万次操作,我如何优化计算Gxx?如果我只是使用嵌套for循环来执行求和,则需要很长时间。有没有一种方法可以使用求和函数或其他方法来提高此过程的效率

作为参考,我当前的psuedo代码执行以下操作:

rrange=range(r-(rows-1)/2,r+(rows-1)/2)
crange=range(c-(cols-1)/2,c+(cols-1)/2)
Gxx=0
for rval,cval in product(rrange,crange):
        #sum( for x in range())
        Gxx+=(someval(rval,cval)-someval2)^2

对于计算Gxx(r,c)元素的单个元素,您无法优化任何内容。这是合乎逻辑的:毕竟你对x的结构一无所知,所以你必须阅读范围内的所有xj,i元素

但是,如果需要计算整个矩阵,情况会发生变化。在这种情况下,您可以重用计算上一个元素所做的工作

首先是一些基础数学。因为x-bar(r,c)不依赖于j或i,所以在这个过程中它是一个常数。现在我们知道:

(a-b)^2 = a^2+b^2-2*a*b
如果你把它替换回x-bar a常数。因此,如果您将其应用于某个信息,您可以声明:

---                ---
\                  \
/     (x_ji-b)^2 = /   x_ji^2-2*b*x_ji+b^2   = S-2*s*b-D*b^2
---                ---
i,j                i,j
用x元素的
S
平方和和S表示x元素的和

现在,如果你看一个矩阵,第一次迭代,你使用矩阵的某个域:

x  x  x  x  x  x  x  x  x
  /-------\
x |x  x  x| x  x  x  x  x
  |       |
x |x  x  x| x  x  x  x  x
  |       |
x |x  x  x| x  x  x  x  x
  \-------/
x  x  x  x  x  x  x  x  x
下一次迭代中,您只需将范围进一步移动一个元素,以便:

x  x  x  x  x  x  x  x  x
     /-------\
x  x |x^ x^ x| x  x  x  x
     |       |
x  x |x^ x^ x| x  x  x  x
     |       |
x  x |x^ x^ x| x  x  x  x
     \-------/
x  x  x  x  x  x  x  x  x
^
表示的
x
s换句话说是重用的。所以我们能做的就是使用某种滑动窗口

因此,您第一次计算元素的总和和平方和时(存储它们)。下次每次移动“光标”时,再次减去不再在范围内的行列,并添加在范围内出现的列。因此,基本算法是:

for r in range (rmin,rmax) :
    sum = 0
    sumsq = 0
    jmin = r-(rows-1)/2
    jmax = r+(rows-1)/2

    #calculate sum and sum of square of the first
    imin = cmin-(cols-1)/2
    imax = cmin+(cols-1)/2
    for j,i in product(range(jmin,jmax),range(imin,imax)) :
        xji = x(j,i) #cache xji
        sum += xji
        sumsq += xji * xji
    d = (jmax-jmin)*(imax-imin)
    #now we can calculate the first element of the row
    xb = xbar(r,cmin)
    Gxx(r,cmin) = sumsq-2*sum*xb+d*xb*xb

    #now iterate over all elements (except the first)
    for c in range(cmin+1,cmax) :
        isub = c-1-(cols-1)/2 #column to remove, (previous column = -1)
        iadd = c+(cols-1)/2 #column to add
        for j in range(jmin,jmax) :
            xji = x(j,isub)
            sum -= xji
            sumsq -= xji*xji
            xji = x(j,iadd)
            sum += xji
            sumsq += xji*xji
        #Now the sums and the sum of squares are updated
        xb = xbar(r,c)
        Gxx(r,c) = sumsq-2*sum*xb+d*xb*xb
我认为将有一些工作,以适应算法,但它应该是可行的。此外,请先检查一个小实例,看看它是否工作正常。小的舍入误差是可能的


如果
很小,这不会有太大的区别,但如果它们很大,则会产生巨大的提升。

r,c的x-bar是什么,它与x_j,i有什么关系?@CommuSoft忽略这些奇怪的符号,它可以是任何东西,我只是在寻找一种无需forloop就能优化双求和的方法。如果它们不相关,那么你再优化也比不上天真了。然而,这看起来很模糊,要么是卷积滤波器,要么是一个滤波器。在这两种情况下都可以优化。我假设您需要计算整个Gxx矩阵(所以所有可能的r和c)?谢谢,我来看看