我正在使用Scipy开展FEM项目。现在我的问题是,那 稀疏矩阵的装配太慢了。我计算了 密集小矩阵中每个元素的贡献(每个元素一个 元件)。对于全局矩阵的汇编,我遍历所有矩阵 小密集矩阵并按以下方式设置矩阵条目:
[i,j] = someList[k][l]
Mglobal[i,j] = Mglobal[i,j] + Mlocal[k,l]
Mglobal
是一个适当大小的lil_matrice,someList
映射
索引变量。
当然这很慢,消耗了大部分的基质 组装时间。有没有更好的方法来组装一个大的稀疏矩阵 来自许多小密集矩阵?我试过scipy.weave,但事实并非如此 似乎适用于稀疏矩阵
答案 0 :(得分:4)
我发布了对scipy邮件列表的回复;堆栈溢出更容易一些 访问所以我也会在这里发布,虽然版本略有改进。
诀窍是使用IJV存储格式。这是三个阵列的三重奏 第一个包含行指示,第二个包含列指示,和 第三个具有该位置的矩阵值。这是最好的方法 建立有限元矩阵(或我认为的任何稀疏矩阵)作为访问 这种格式非常快(只是填充一个数组)。
在scipy中,这称为coo_matrix
;该类将三个数组作为一个
论点。它实际上只对转换为另一种格式有用(CSR os
CSC)用于快速线性代数。
对于有限元,您可以通过某种方式估计三个数组的大小 像
size = number_of_elements * number_of_basis_functions**2
所以如果你有2D样方,你会做number_of_elements * 36,例如。 这种方法很方便,因为如果你有本地的matricies肯定 拥有全球数字和参赛价值:正是您需要的建筑 三个IJV阵列。 Scipy很聪明,可以抛出零条目,所以 过高估计是好的。