我需要反转一个大的,密集的矩阵,我希望使用Scipy gmres来做.幸运的是,密集矩阵A遵循模式,我不需要将矩阵存储在内存中.在LinearOperator类允许我们构建其用作基质GMRES一个对象,并可以直接计算矩阵矢量乘积A*v.也就是说,我们编写一个函数mv(v),它将向量作为输入v并返回mv(v) = A*v.然后,我们可以使用LinearOperator该类来创建A_LinOp = LinearOperator(shape = shape, matvec = mv).我们可以将线性运算符放入Scipy gmres命令中来评估矩阵向量积,而无需完全加载A到内存中.
该文档可在LinearOperator此处找到:LinearOperator文档.
这是我的问题:编写例程来计算矩阵向量积mv(v) = A*v,我需要另一个输入向量C.条目A是表格A[i,j] = f(C[i] - C[j]).所以,我真正想要的是mv两个输入,一个固定矢量输入C和一个v我们想要计算的变量输入A*v.
MATLAB具有类似的设置,其中将写入x = gmres(@(v) mv(v,C),b)在那里b是问题的右手侧Ax = b,并且mv是取作为变量输入的功能v,我们需要计算A*v和C …
我正在尝试使用 Multiprocessing 和 Pool.map() 命令并行化我一直在研究的算法。我遇到了一个问题,希望有人能指出我正确的方向。
让 x 表示一个 N 行 1 列的数组,它被初始化为一个零向量。让 C 表示一个长度为 N 乘以 2 的数组。向量 x 是通过使用来自 C 的某些子集的信息(进行一些数学运算)迭代构建的。作为大型 for 循环的代码(未并行化)大致如下所示:
for j in range(0,N)
#indx_j will have n_j <<N entries
indx_j = build_indices(C,j)
#x_j will be entries to be added to vector x at indices indx_j
#This part is time consuming
x_j = build_x_j(indx_j,C)
#Add x_j into entries of x
x[indx_j] = x[indx_j] + x_j
Run Code Online (Sandbox Code Playgroud)
我能够使用 multiprocessing 模块并行化它并使用 pool.map 来消除大型 for 循环。除了将 x_j 添加到 x[indx_j] 的步骤之外,我编写了一个执行上述计算的函数。相反,并行化函数返回两个数据集:x_j …