如何在python/scipy中有效地组装大型稀疏矩阵

2024-09-28 23:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Mglobal是一个适当大小的lil矩阵,someList映射 索引变量。在

当然,这是最慢的 装配时间。有没有更好的方法来组装大型稀疏矩阵 从许多小密矩阵?我试过了细纹织物但事实并非如此 似乎可以处理稀疏矩阵


Tags: 项目方法元素方式时间矩阵scipy贡献
1条回答
网友
1楼 · 发布于 2024-09-28 23:19:20

我将我的响应发布到scipy邮件列表;堆栈溢出更容易一些 所以我也会把它贴在这里,尽管是一个稍微改进的版本。在

诀窍是使用IJV存储格式。这是三个阵列的三个 其中第一个包含行指示符,第二个包含列指示符,并且 第三个矩阵的值在那个位置。这是最好的办法 建立有限元矩阵(或我认为的任何稀疏矩阵)作为访问 这种格式非常快(只需填充一个数组)。在

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

对于有限元,你可以用一些东西来估计这三个数组的大小 像

size = number_of_elements * number_of_basis_functions**2

所以,如果你有二维二次方,你可以做个数_个元素*36,例如。 这种方法很方便,因为如果你有当地的婚姻你肯定 有全局数字和输入值:正是您需要的构建 三个IJV阵列。Scipy足够聪明,可以抛出0个条目,所以 高估是可以的。在

相关问题 更多 >