如何在 Python 中为稀疏矩阵在整个对角线上放置一个条目
How to put one entry across an entire diagonal for a sparse matrix in Python
我正在寻求构建一个矩阵,我将计算其逆矩阵。这将用于求解非线性抛物线 PDE 的隐式方法。我目前的计算是,这将变得显而易见,给了我一个奇异(不可能的逆)矩阵。对于上下文,实际上矩阵的尺寸为 30 x 30,但在这些示例中,我使用较小的矩阵进行测试。
假设我想创建一个大的方形稀疏矩阵。使用 spdiags
仅允许您分别输入主对角线、下对角线和上对角线的成员。那么如何才能使每条对角线的所有条目都具有一个值?
示例代码:
import numpy as np
from scipy.sparse import spdiags
from numpy.linalg import inv
updiag = -0.25
diag = 0.5
lowdiag = -0.25
Jdata = np.array([[diag], [lowdiag], [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray()
print(J)
inverseJ = inv(J)
print(inverseJ)
这将生成一个 3 x 3 矩阵,但仅包含给定的每个对角线的第一个条目。我想知道使用 np.fill_diagonal
但这首先需要一个矩阵并且只需要主对角线。我是不是误会了什么?
spdiags
的第一个参数是用作对角线的值矩阵。你可以这样使用它:
Jdata = np.array([3 * [diag], 3 * [lowdiag], 3 * [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray()
print(J)
# [[ 0.5 -0.25 0. ]
# [-0.25 0.5 -0.25]
# [ 0. -0.25 0.5 ]]
我正在寻求构建一个矩阵,我将计算其逆矩阵。这将用于求解非线性抛物线 PDE 的隐式方法。我目前的计算是,这将变得显而易见,给了我一个奇异(不可能的逆)矩阵。对于上下文,实际上矩阵的尺寸为 30 x 30,但在这些示例中,我使用较小的矩阵进行测试。
假设我想创建一个大的方形稀疏矩阵。使用 spdiags
仅允许您分别输入主对角线、下对角线和上对角线的成员。那么如何才能使每条对角线的所有条目都具有一个值?
示例代码:
import numpy as np
from scipy.sparse import spdiags
from numpy.linalg import inv
updiag = -0.25
diag = 0.5
lowdiag = -0.25
Jdata = np.array([[diag], [lowdiag], [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray()
print(J)
inverseJ = inv(J)
print(inverseJ)
这将生成一个 3 x 3 矩阵,但仅包含给定的每个对角线的第一个条目。我想知道使用 np.fill_diagonal
但这首先需要一个矩阵并且只需要主对角线。我是不是误会了什么?
spdiags
的第一个参数是用作对角线的值矩阵。你可以这样使用它:
Jdata = np.array([3 * [diag], 3 * [lowdiag], 3 * [updiag]])
Diags = [0, -1, 1]
J = spdiags(Jdata, Diags, 3, 3).toarray()
print(J)
# [[ 0.5 -0.25 0. ]
# [-0.25 0.5 -0.25]
# [ 0. -0.25 0.5 ]]