scipy.sparse.diags生成三对角矩阵结果与预期不符的疑问
解决scipy.sparse.diags生成三对角矩阵的偏移量误解问题
嘿,我来帮你理清这个问题!你遇到的核心问题是对scipy.sparse.diags里的offset(偏移量)定义理解有误,同时没把握好各对角线需要的元素长度。
先明确diags的offset规则
首先得搞清楚offset对应的是哪条对角线:
offset=0:主对角线(行号=列号),需要和矩阵阶数相同的元素数量(这里是5个)offset=1:主对角线上方的次对角线(列号=行号+1),也就是右上角的那条,需要n-1个元素(这里是4个)offset=-1:主对角线下方的次对角线(列号=行号-1),也就是左下角的那条,同样需要n-1个元素(这里是4个)
分析你的代码问题
看你预期的Tridiagonal_1:
- 主对角线是
v2的全部5个元素,这个没问题 - 左下角的次对角线(offset=-1)是
v1的第2到第5个元素:[13.,28.5,50.,77.5](对应v1[1:]) - 右上角的次对角线(offset=1)是
v3的第1到第4个元素:[2.5,11.,25.5,46.](对应v3[:-1])
但你现在传给diags的是完整的v1和v3(各5个元素),diags会自动从数组开头截取前4个元素来填充对应对角线,这就导致你得到的结果和预期不符。
正确的实现代码
调整v1和v3的长度,匹配对应对角线的需求,再传入diags:
from scipy.sparse import diags import numpy as np v1 = [3*i**2 +(i/2) for i in range(1, 6)] v2 = [-(6*i**2 - 1) for i in range(1, 6)] v3 = [3*i**2 -(i/2) for i in range(1, 6)] # 调整对角线元素:offset=-1取v1[1:],offset=1取v3[:-1] matrix = diags([v1[1:], v2, v3[:-1]], [-1, 0, 1], (5,5)).toarray() print(matrix)
输出结果
运行后得到的矩阵完全符合你的预期:
array([[ -5. , 2.5, 0. , 0. , 0. ], [ 13. , -23. , 11. , 0. , 0. ], [ 0. , 28.5, -53. , 25.5, 0. ], [ 0. , 0. , 50. , -95. , 46. ], [ 0. , 0. , 0. , 77.5, -149.]])
简单总结:diags的offset=-1对应的是主对角线下方的左下对角线,需要的是比主对角线少一个元素的数组,而且要注意你需要的元素是原数组的哪一段,这样就能生成你想要的三对角矩阵啦!
内容的提问来源于stack exchange,提问作者Josmoor98
相关产品推荐
相关产品推荐

