2014-04-13 45 views
3

我挣扎在Python中创建以下列表:转换MATLAB代码为蟒蛇的矩阵构建

| 1 -2 1 0 ... 0 | 
| 0 1 -2 1 ... ... | 
|... ... ... ... 0 | 
| 0 ... 0 1 -2 1 | 

我已经低于该MATLAB代码似乎产生了这个矩阵(article),但我不能转换它在Python代码中。

Matlab代码:

D2 = spdiags(ones(T-2,1)*[1 -2 1],[0:2],T-2,T); 

T是列数。

在Python代码如下所示:

from scipy.sparse import spdiags 
D2 = spdiags((ones((T-2,1))*array([1,-2,1])),arange(0,3),T-2,T) 

后者产生以下错误:

ValueError: number of diagonals (327) does not match the number of offsets (3)

但是,如果我转这样的矩阵:

D2 = spdiags((ones((T-2,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 

我得到以下结果:

matrix([[ 1., -2., 1., ..., 0., 0., 0.], 
     [ 0., 1., -2., ..., 0., 0., 0.], 
     [ 0., 0., 1., ..., 0., 0., 0.], 
     ..., 
     [ 0., 0., 0., ..., 1., 0., 0.], 
     [ 0., 0., 0., ..., -2., 0., 0.], 
     [ 0., 0., 0., ..., 1., 0., 0.]]) 

有人可以帮助我吗?我错在哪里?

+0

你在用什么T值?我并不完全知道发生了什么,但值得注意的是,当评估第一个表达式时(<3x5稀疏矩阵类型'' \t与9个已存储的值,T = 5会产生明显好的结果元素(3个对角线)以Diorgonal格式> )。 – Daryl

+1

看到http://stackoverflow.com/questions/16030620/translate-matlab-code-to-python-scipy,似乎有人在做同样的事情,并有他们的问题回答。 – Daryl

+0

我也发现这个问题。但实际上它仍然不适合我。 T可以在100以上。对于较小的T值,我可以看出这是有效的,但似乎并不完全。我预计矩阵的结尾会以'1 2 1'结尾,但实际上您可以看到它以'1 0 0'结尾。我没有matlab来查看该函数如何创建矩阵。 –

回答

0

更改此:

D2 = spdiags((ones((T-2,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 

这样:

D2 = spdiags((ones((T,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 
也就是说,所需的行中的第一个参数的长度,这是含有对角线阵列

,等于结果中的列数。

+0

这是与matlab /八度的区别!我设法以八度音阶执行原始代码,并且最终得到相同的矩阵以及修复后的预期结果。谢谢沃伦! –