matlab中spdiags和python中scipy.sparse.spdiags转换

今天在将matlab中去趋势代码转换到python中时,发现两者spdiags(提取并创建稀疏带状和对角矩阵)有所不同
代码:
matlab:

spdiags(ones(632,1)*[1 -2 1],[0 1 2],632,634)

1、[1,-2,1]重复632行
2、生成的[632,634]矩阵里,对角线都是[1 -2 1]的第一个1(对角线意思是从左上 开始的对角,与是否为方阵无关),对角线右边第1个数都是-2,对角线右边第2个数都是1。
由此生成了要的稀疏对角矩阵

python
首先要明白matlab和python语言spdiags的不同,python中numpy中生成稀疏阵,是行检索生成,matlab是列检索生成。可见

https://stackoverflow.com/questions/31900043/spdiags-in-matlab-into-python
其中python矩阵生成了就必须有转置操作

由此python代码:

import scipy as sp
sp.sparse.spdiags((np.ones((632,1))*[1, -2, 1]).transpose(), [0, 1, 2], 632, 634)

按理说转置了是可以的,但经过排查发现最后两行有差错少了几个数(可能是对函数理解不到位)
最后python纠正代码如下:

#N=上面的634
D2 = sp.sparse.spdiags((np.ones((N-2,1))*[1, -2, 1]).transpose(), [0, 1, 2], N-2, N)
a = np.zeros((N-2,N),dtype=np.int)
a[N-4,N-2] = 1
a[N-3,N-2] = -2
a[N-3,N-1] = 1
D2 = D2 + a

花了我2个多小时,坑爹啊~

发布了22 篇原创文章 · 获赞 4 · 访问量 3125

猜你喜欢

转载自blog.csdn.net/weixin_43633568/article/details/103203089