我想在 Python 中反转一个 10X10 反对称矩阵大约 10,000 - 20,000 次。除了在 Python 中使用内置的反函数之外,还有更快的方法吗?
谢谢。
我想在 Python 中反转一个 10X10 反对称矩阵大约 10,000 - 20,000 次。除了在 Python 中使用内置的反函数之外,还有更快的方法吗?
谢谢。
当 Jack Poulson 回答关于反对称(或斜对称)矩阵指数的相关问题时,我从他那里学到了这个技巧。
反对称(通常称为斜对称矩阵)是其中的矩阵。由于矩阵没有被称为斜厄米特矩阵,我假设矩阵是真实的。
方便的是,,其中表示 Hermitian 转置,因此您可以计算,并使用 LAPACK 例程 ZHESV (或 CHESV ;除非它也是正定的,在在这种情况下,您可以使用 ZPOSV 或 CPOSV)。此时,您有。因此。
不幸的是,NumPy 和 SciPy 没有实现这些功能(你必须从另一种语言中调用它们,如 Fortran、C、C++、Java 等;可能还有其他库为 LAPACK 提供 Python 接口,但我不知道有什么可以实现所有这些)。根据模块scipy.linalg,您最好的选择可能是调用scipy.linalg.solve(并忽略任何对称性),或者如果是 Hermitian 正定的,则在适当地重新排列数据后调用。scipy.linalg.solveh_banded
scipy.linalg.solve从源头上看,在高层次上,调用或调用都没有关系scipy.linalg.inv;两者最终都是 LAPACK 调用。如果任何可能的速度差异很重要,您不妨测试两者,但在此之前,您最好确保使用高质量的 BLAS 实现(ATLAS、英特尔 MKL(如果适用)、GotoBLAS)和确保相应地构建 LAPACK、NumPy 和 SciPy。此外,如果这些矩阵有任何任务并行性,您也可以利用它。
所有这些都假设您要反转 10,000 - 20,000 个不同的矩阵。我假设如果你想多次反转同一个矩阵,你知道只计算一次 LU 分解,然后用它来求解一个有 10,000 - 20,000 个不同右手边(每个都有相同的系数矩阵)的线性系统,在这种情况下,相应的功能会标记在 中scipy.linalg。如果需要,我可以添加更多详细信息。
是的,这是发布问题的错误位置,但无法抗拒回答。
Python 没有内置的逆矩阵。Numpy 可以。Numpy 的算法是用低级语言编写的,由矩阵求逆专家编写,因此它的速度尽可能快。除非您自己是矩阵求逆专家,否则您无法编写更快的。
您真的应该在数学或 IT 堆栈交换中询问,但是如果您想要外行的观点:
Python 的矩阵求逆很可能是用高级语言编写和编译的,因此它会比解释的 Python 代码快很多
据我所知,没有专门针对反对称矩阵的任何巧妙的捷径算法
所以我会使用 Python 实现而不是自己编写(在 Python 中)。