3

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

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

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

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

4

1 回答 1

4

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

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

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

对于有限元,您可以通过类似的方式估计三个数组的大小

size = number_of_elements * number_of_basis_functions**2

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

于 2012-05-13T01:10:52.137 回答