我正在尝试执行大型线性代数计算,以将通用协方差矩阵KK_l_obs(形状(NL, NL))转换为缩小空间Kmap_PC(形状(q, q, X, Y))中的协方差矩阵的映射.
有关如何Kmap_PC为每个空间位置构造的信息保存在其他数组a中I0,和k_l_th.前两个有形状(X, Y),第三个有形状(nl, nl).观察到的和缩小的空间之间的转换由eingenvectors E(形状(q, nl))传递.请注意NL> nl.
空间元素Kmap_PC计算如下:
Kmap_PC[..., X, Y] = E.dot(
KK_l_obs[I0[X, Y]: I0[X, Y] + nl,
I0[X, Y]: I0[X, Y] + nl] / a_map[X, Y] + \
k_l_th).dot(E.T)
Run Code Online (Sandbox Code Playgroud)
理论上,第一个点积内的位可以直接使用np.einsum,但会占用数百GB的内存.我现在正在做的是循环空间索引Kmap_PC,这很慢.我也可以使用MPI分配计算(这可能会提供3-4倍的加速,因为我有16个核心可用).
我在想:
(a)如果我能更有效地进行计算 - 或许明确地将其分解为空间元素组; 和
(b)如果我可以改善那些计算的内存开销.
代码段
import numpy …Run Code Online (Sandbox Code Playgroud)