【问题标题】:Convert matlab code into python for matrix creation将 matlab 代码转换为 python 以创建矩阵
【发布时间】:2014-05-27 08:02:31
【问题描述】:

我正在努力在 python 中创建以下矩阵:

| 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: 对角线数 (327) 与 偏移量 (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.]])

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

【问题讨论】:

  • 您使用什么 T 值?我不完全确定发生了什么,但值得注意的是,当评估第一个表达式时,T=5 会产生一个明显 OK 的结果(',包含 9 个存储元素( 3 条对角线) DIAgonal 格式>).
  • stackoverflow.com/questions/16030620/…,似乎其他人也在做同样的事情并且他们的问题得到了解答。
  • 我也发现了这个问题。但实际上它仍然对我不起作用。 T 可以高于 100。使用较小的 T 值,我可以看到这可行,但似乎并不完全。我预计矩阵的结尾以“1 -2 1”结尾,但实际上如您所见,它以“1 0 0”结尾。我没有 matlab 来查看这个函数究竟是如何创建矩阵的。

标签: python matlab matrix scipy


【解决方案1】:

改变这个:

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)

也就是说,您希望第一个参数(即包含对角线的数组)中的行长度等于结果中的列数。

【讨论】:

  • 这就是matlab/octave的区别!我已经设法以八度音阶执行原始代码,最终得到相同的矩阵和您修复的预期结果。谢谢沃伦!
猜你喜欢
  • 2017-03-10
  • 2018-08-12
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多