gpt4 book ai didi

python - 稀疏(刚度)矩阵的高性能创建

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:07 32 4
gpt4 key购买 nike

我目前正在实现一个小型有限元模拟。使用 Python/Numpy,我正在寻找一种有效的方法来创建全局刚度矩阵:

1)我认为应该使用coo_matrix()从较小的单元刚度矩阵创建稀疏矩阵。但是,我可以扩展现有的 coo_matrix,还是应该从最终的 i、j 和 v 列表创建它?

2) 目前,我正在使用列表推导式从较小的单元刚度矩阵创建 i 和 j 列表并将它们连接起来。有更好的方法来创建这些列表吗?

3) 创建数据向量:同样的问题,由于易于扩展的可能性,Python 列表是否优于 numpy 向量?

4)当然,我愿意接受任何建议:)。谢谢!

这是我当前计划进行全局大会的一个小例子,以明确我的意图:

import numpy as np
from scipy.sparse import coo_matrix

#2 nodes, 3 dof per node
locations = [0, 6]
nNodes = 2
dof =3
totSize = nNodes * dof
Ke = np.array([[1,1,1, 2,2,2],
[1,1,1, 2,2,2],
[1,1,1, 2,2,2],
[2,2,2, 3,3,3],
[2,2,2, 3,3,3],
[2,2,2, 3,3,3]])

I = []
J = []
#generate rowwise i and j lists:
i = [ idx + u for i in range(totSize) for idx in locations for u in range(dof) ]
j = [ idx + u for idx in locations for u in range(dof) for i in range(totSize) ]
I += i
J += J

Data = Ke.flatten()

cMatrix = coo_matrix( (Data, (i,j)), )

最佳答案

在这篇文章中,我将尝试重点关注创建列表 ij 以及最后的矩阵 cMatrix 所特有的性能问题。

在这些循环/列表理解下,您基本上是在执行 locationsrange(dof) 的按元素相加。移植到 NumPy,我们可以利用 broadcasting那里。最后,为了在这些推导式中再次模拟 range(totSize),我们可以使用 np.tile 对最终的加法结果进行平铺。我们将使用它作为稀疏矩阵列索引的扁平化版本以及行的转置扁平化版本。

因此,实现看起来像这样 -

idx0 = (np.asarray(locations)[:,None] + np.arange(dof)).ravel()
J = np.tile(idx0[:,None],totSize)
cMatrix = coo_matrix( (Data, (J.ravel('F'),J.ravel())), )

关于python - 稀疏(刚度)矩阵的高性能创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471450/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com