擅长:python、mysql、java
<p>内环的矢量化相当简单。你有一个基本方程,如下所示:</p>
<pre><code>X[n] = a * X[n-1] + b[n]
</code></pre>
<p>这个方程可以展开和重写,而不依赖于X[n-1]:</p>
^{pr2}$
<p>如果原始代码是这样的:</p>
<pre><code>for i in np.arange(1,nx+1):
for j in np.arange(1,nz+1):
flux2[i,j] = 0.5*(flux2[i-1,j] + bz[i-1,j]*dx) \
+ 0.5*(flux2[i,j-1] - bx[i,j-1]*dz)
</code></pre>
<p>你可以像这样去掉内部循环:</p>
<pre><code>a = 0.5
aexp = np.arange(nz).reshape(nz, 1) - np.arange(nz).reshape(1, nz)
abcoeff = a**aexp
abcoeff[aexp<0] = 0
for i in np.arange(1,nx+1):
b = 0.5*flux2[i-1, 1:] + 0.5*bz[i-1, 1:]*dx - 0.5*bx[i,:-1]*dz
bvals = (abcoeff * b.reshape(1, nz)).sum(axis=1)
n = np.arange(1, nz+1)
x0 = flux2[i, 0]
flux2[i, 1:] = a**n * x0 + bvals
</code></pre>
<p>由于浮点错误,这些值不会完全相同,但足够接近。
从理论上讲,您可以应用相同的过程来消除这两个循环,但这会变得相当复杂,并且根据阵列的形状,可能不会提供太多的性能优势。在</p>