目标 我的目标是计算您可以在下面看到的公式给出的张量。指数 i、j、k、l 从 0 到 40,p、m、x 从 0 到 80。
Tensordot 方法这个总和只是收缩了巨大张量的 6 个指数。我试图通过允许这种计算的张量点来做到这一点,但是我的问题是内存,即使我先做一个张量点,然后再做另一个。(我在 colab 工作,所以我有 12GB RAM 可用)
嵌套循环方法但是有一些额外的对称性控制 B 矩阵,即 B{ijpx} 的唯一非零元素使得 i+j= p+x。因此,我能够将 p 和 m 写为 x (p=i+jx, m=k+lx) 的函数,然后我做了 5 个循环,即为 i,j,k,l,x 但另一方面时间是问题,因为计算需要 136 秒,我想重复很多次。
嵌套循环方法中的时序目标将时间减少 10 倍是令人满意的,但如果可以将其减少 100 倍,那就绰绰有余了。
您对解决内存问题或减少时间有什么想法吗?您如何处理带有附加约束的此类求和?
(备注:矩阵 A 是对称的,到目前为止我还没有使用过这个事实。没有更多的对称性。)
这是嵌套循环的代码:
for i in range (0,40):
for j in range (0,40):
for k in range (0,40):
for l in range (0,40):
Sum=0
for x in range (0,80):
p=i+j-x
m=k+l-x
if p>=0 and p<80 and m>=0 and m<80:
Sum += A[p,m]*B[i,j,p,x]*B[k,l,m,x]
T[i,j,k,l]= Sum
张量点方法的代码:
P=np.tensordot(A,B,axes=((0),(2)))
T=np.tensordot(P,B,axes=((0,3),(2,3)))