【问题标题】:How to assemble large sparse matrices effectively in python/scipy如何在 python/scipy 中有效地组装大型稀疏矩阵
【发布时间】:2012-05-18 08:01:57
【问题描述】:

我正在使用 Scipy 进行 FEM 项目。现在我的问题是 稀疏矩阵的组装太慢了。我计算 密集小矩阵中每个元素的贡献(每个元素一个 元素)。对于全局矩阵的组装,我遍历所有 小密集矩阵并按以下方式设置矩阵条目:

[i,j] = someList[k][l]
Mglobal[i,j] = Mglobal[i,j] + Mlocal[k,l]

Mglobal 是一个适当大小的 lil_matrice,someList 映射 索引变量。

当然,这相当慢,并且消耗了大部分矩阵 组装时间。有没有更好的方法来组装一个大的稀疏矩阵 从许多小的密集矩阵?我试过 scipy.weave 但它没有 似乎适用于稀疏矩阵

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    我在 scipy 邮件列表中发布了我的回复;堆栈溢出更容易一些 访问,所以我也会在这里发布,尽管版本略有改进。

    诀窍是使用 IJV 存储格式。这是三个数组的三重奏 其中第一个包含行索引,第二个包含列索引,并且 第三个具有该位置的矩阵值。这是最好的方法 构建有限元矩阵(或我认为的任何稀疏矩阵)作为访问 到这种格式真的很快(只是填充一个数组)。

    在 scipy 中,这称为coo_matrix;该类将三个数组作为 争论。它实际上只对转换为另一种格式有用(CSR os CSC) 用于快速线性代数。

    对于有限元,你可以通过一些东西来估计三个数组的大小 喜欢

    size = number_of_elements * number_of_basis_functions**2
    

    因此,如果您有 2D 二次方,例如,您可以使用 number_of_elements * 36。 这种方法很方便,因为如果你有本地矩阵,你肯定 具有全局数字和条目值:正是您构建所需的 三个 IJV 阵列。 Scipy 足够聪明,可以丢弃零条目,所以 高估是好的。

    【讨论】:

    • @cp3028:请注意,您不需要使用 coo_matrix 手动进行任何求和,您可以有多个引用相同元素的条目,这些条目将在转换为另一种格式时求和。见:scipy-lectures.github.com/advanced/scipy_sparse/coo_matrix.html
    • 嗨,大卫,非常感谢您的帮助。 COO 矩阵的使用导致了超过一个数量级的加速!
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2017-02-17
    • 2020-07-30
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多