我正在解决需要对稠密平方矩阵求逆的微分方程。这种矩阵求反消耗了我的大部分计算时间,所以我想知道我是否正在使用最快的算法。
我当前的选择是numpy.linalg.inv。从我的数字中,我看到它的缩放比例为,其中n是行数,因此该方法似乎是高斯消除法。
根据维基百科,有更快的算法可用。有谁知道是否有一个实现这些的库?
我想知道,为什么不用numpy使用这些更快的算法?
scipy.sparse
帮助?
scipy.sparse
这有什么关系?
我正在解决需要对稠密平方矩阵求逆的微分方程。这种矩阵求反消耗了我的大部分计算时间,所以我想知道我是否正在使用最快的算法。
我当前的选择是numpy.linalg.inv。从我的数字中,我看到它的缩放比例为,其中n是行数,因此该方法似乎是高斯消除法。
根据维基百科,有更快的算法可用。有谁知道是否有一个实现这些的库?
我想知道,为什么不用numpy使用这些更快的算法?
scipy.sparse
帮助?
scipy.sparse
这有什么关系?
Answers:
(评论时间太长了...)
我假设您实际上需要在算法中计算逆。1首先,重要的是要注意,这些替代算法实际上并没有声称具有更快的速度,只是它们具有更好的渐近复杂度(这意味着所需的基本运算数量增长得较慢)。实际上,实际上,由于以下原因,这些方法实际上比标准方法(对于给定的)要慢得多。
所述 -notation兽皮中的功率的前面的恒定,其可以是大天文数字-如此之大,可以比小得多任何该在可预见的将来可以由任何计算机处理。(例如,Coppersmith–Winograd算法就是这种情况。)
复杂性假定每个(算术)运算都花费相同的时间-但这在实际实践中远非如此:将一堆数字与相同的数字相乘比将相同数量的不同数字相乘要快得多。这是由于以下事实:当前计算的主要瓶颈是将数据放入缓存,而不是对该数据进行实际的算术运算。因此,可以重新安排为具有第一种情况的算法(称为“ 缓存感知”)将比不可能的算法快得多。(例如,Strassen算法就是这种情况。)
同样,数值稳定性至少与性能同样重要。在这里,通常,标准方法通常会胜出。
因此,标准的高性能库(BLAS / LAPACK,当您要求Numpy计算逆时会调用Numpy)通常仅实现此方法。当然,那里有Numpy的实现,例如Strassen算法,但是在汇编级别手动调整的算法将大大击败写在任何合理的矩阵大小的高级语言算法。
numpy.linalg.solve
您可能应该注意到,埋入numpy源代码的深处(请参阅https://github.com/numpy/numpy/blob/master/numpy/linalg/umath_linalg.c.src),inv例程会尝试调用dgetrf函数从系统LAPACK程序包中执行,然后对原始矩阵执行LU分解。从道德上讲,这等效于高斯消除,但是可以通过在高性能BLAS中使用更快的矩阵乘法算法将其调整为稍微降低的复杂度。
如果您遵循这种方法,则应警告您,强迫整个库链使用新库,而不是与发行版一起提供的系统库相当复杂。现代计算机系统上的一种替代方法是使用scaLAPACK或(在python世界中)petsc4py之类的程序包研究并行化方法。但是,与应用于直接方法相比,这些方法通常更适合用作线性代数系统的迭代求解器,而在特定目标稀疏系统中,PETSc比适用于直接方法更有效。