Numpy 解析函数和线性代数中的繁重计算
对于光学波前传播中的非标准计算,我需要处理非常大的矩阵(大约10^6*10^6个条目),这些矩阵不是稀疏的或以任何方式“可还原” 代码大致如下:Numpy 解析函数和线性代数中的繁重计算,numpy,blas,scientific-computing,numexpr,Numpy,Blas,Scientific Computing,Numexpr,对于光学波前传播中的非标准计算,我需要处理非常大的矩阵(大约10^6*10^6个条目),这些矩阵不是稀疏的或以任何方式“可还原” 代码大致如下: import numpy as np x = np.linspace(-Nx / 2, Nx / 2 - 1, Nx) * deltax q = np.linspace(-Nq / 2, Nq / 2 - 1, Nq) * deltaq xg, qg =np.meshgrid(x, q) kernel = np.exp(1j * 2 * np.pi
import numpy as np
x = np.linspace(-Nx / 2, Nx / 2 - 1, Nx) * deltax
q = np.linspace(-Nq / 2, Nq / 2 - 1, Nq) * deltaq
xg, qg =np.meshgrid(x, q)
kernel = np.exp(1j * 2 * np.pi * qg * xig)
u = np.dot(kernel, u0)
这里,Nx、Nq是大数,deltax、deltaq是比例因子,u0是合适的向量。事实上,内核不是上述傅立叶类型,而是更复杂的
当然,矩阵对于RAM来说太大了,所以整个过程必须划分为更小的块。事实上,我计算内核的行块,然后做相应的点积,它给出了u的块。但是,我没有在上面的代码中包含此过程,以便将重点放在主要问题上
这里有两个耗时的操作:
您能推荐一些初学者可以使用的加速程序(特别是涉及并行化的加速程序)吗?您能这样做吗
x = np.linspace(-Nx / 2, Nx / 2 - 1, Nx) * deltax
q = np.linspace(-Nq / 2, Nq / 2 - 1, Nq) * deltaq
u = np.empty_like(u0)
for i in np.arange(Nx).flat:
u[i] = np.dot(np.exp(1j * 2 * np.pi * q * x[i]), u0)
它将比矢量化的速度慢(因为您正在逐行计算内核),但不应该使内存溢出是否有任何理由不逐项计算
u
,或者至少在块中计算?事实上,这就是我为防止RAM耗尽所做的基本工作。然而,我不是一行一行地做这件事,而是一行一行地做。为了从numpy向量运算中获益,这些行块被选得尽可能大。这可能是你最好的选择。我编辑了我的原始帖子,从一开始就把这一点讲清楚了。