Python 使用'scipy.sparse'构造简单线性系统`
想象一个简单的3x3矩阵,我在它上面施加以下“边界条件”。下面是一个数组,显示了相应的索引(如果展平)和边界值Python 使用'scipy.sparse'构造简单线性系统`,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,想象一个简单的3x3矩阵,我在它上面施加以下“边界条件”。下面是一个数组,显示了相应的索引(如果展平)和边界值 I = B = 0 3 6 3 0 1 1 4 7 3 0 1 2 5 8 3 0 1 很容易看出,展平的边值数组 b = 3 3 3 0 0 0 1 1 1 我还有一个连接性结构C,以一组对的形式给出 C = 0 0 1 1 2 3 3 4 4 5 6 7 1 3 2 4 5 4 6 5 7 8 6 8 我想构造一个表示这个线性系统的矩阵a,使用sps
I = B =
0 3 6 3 0 1
1 4 7 3 0 1
2 5 8 3 0 1
很容易看出,展平的边值数组
b =
3 3 3 0 0 0 1 1 1
我还有一个连接性结构C,以一组对的形式给出
C =
0 0 1 1 2 3 3 4 4 5 6 7
1 3 2 4 5 4 6 5 7 8 6 8
我想构造一个表示这个线性系统的矩阵a,使用spsolve(a,b)得到
A =
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0
1 0 0 -3 1 0 1 0 0
0 1 0 1 -4 1 0 1 0
0 0 1 0 1 -3 0 0 1
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1
x =
3 3 3 2 2 2 1 1 1
这是非常简单的使用numpy和操作密集矩阵,零列,等等。然而,随着矩阵变得越来越大,我开始耗尽内存,解算器的速度非常慢
我想我应该用以下逻辑构建稀疏矩阵:
np.ones\u like
其中一个向量初始化矩阵b
为非零:清除行并在对角线处放置1(这表示初始条件)b
为零:沿轴=1对矩阵求和,并将求和的负值放入每个对角线中(这将平衡汇和源)
这在
numpy
中非常有效,但我发现在初始化sparse
矩阵之后,绝对不可能对它们做任何有用的事情。它们不处理项目删除、转置等操作。我能了解一下这些操作吗?我想我到目前为止都会这么做
看起来有点模糊,好像我做错了什么
b = np.array([3, 3, 3, 0, 0, 0, 1, 1, 1])
i = (0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7)
j = (1, 3, 2, 4, 5, 4, 6, 5, 7, 8, 7, 8)
f = b!=0
A = sparse.lil_matrix((b.size, b.size))
A[f,f] = 1
C = sparse.coo_matrix((np.ones_like(i+j), (i+j,j+i)), shape=(b.size, b.size)).tolil()
D = sparse.diags(np.asarray(C.sum(axis=1).T)[0], 0).tocsr()
A[~f,:] = C[~f, :] - D[~f]
print A.toarray()
是的!我今天要把它写下来。