【发布时间】:2015-11-01 05:39:57
【问题描述】:
在 Python 3 中,我尝试运行以下代码行来获取特定的稀疏矩阵。
sparse.spdiags(np.concatenate((-np.ones((9,1)), np.ones((9,1))), axis=1), [0, 1], 9, 10)
这会给出以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/scipy/sparse/construct.py", line 61, in spdiags
return dia_matrix((data, diags), shape=(m,n)).asformat(format)
File "/usr/lib/python3/dist-packages/scipy/sparse/dia.py", line 138, in __init__
% (self.data.shape[0], len(self.offsets)))
ValueError: number of diagonals (9) does not match the number of offsets (2)
在 Octave 中运行我理解的等效代码似乎让我得到了一个稀疏矩阵。
spdiags([-ones(9,1) ones(9,1)],[0 1],9,10)
Compressed Column Sparse (rows = 9, cols = 10, nnz = 18 [20%])
(1, 1) -> -1
(1, 2) -> 1
(2, 2) -> -1
(2, 3) -> 1
(3, 3) -> -1
(3, 4) -> 1
(4, 4) -> -1
(4, 5) -> 1
(5, 5) -> -1
(5, 6) -> 1
(6, 6) -> -1
(6, 7) -> 1
(7, 7) -> -1
(7, 8) -> 1
(8, 8) -> -1
(8, 9) -> 1
(9, 9) -> -1
(9, 10) -> 1
关于他们为什么表现不同以及如何解决的任何想法?
添加
Scipy.sparse 的输出与 Octave 的输出相比,我遇到了另一个问题。
Python
>>> sparse.spdiags(np.concatenate((-np.ones((9,1)),np.ones((9,1))), axis=1).T, [0,1],9,10).A
array([[-1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., -1., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., -1., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., -1., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., -1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., -1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., -1., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., -1., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., -1., 0.]])
>>> sparse.spdiags(np.concatenate((-np.ones((9,1)),np.ones((9,1))), axis=1).T, [0,1],9,10).A.shape
(9, 10)
>>> sparse.spdiags(np.vstack([-np.ones(9),np.ones(9)]), [0,1],9,10).A
array([[-1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., -1., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., -1., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., -1., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., -1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., -1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., -1., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., -1., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., -1., 0.]])
>>> sparse.spdiags(np.vstack([-np.ones(9),np.ones(9)]), [0,1],9,10).A.shape
(9, 10)
>>> sparse.spdiags(np.ones(9)*[[-1],[1]], [0,1],9,10).A
array([[-1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., -1., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., -1., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., -1., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., -1., 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., -1., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., -1., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., -1., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., -1., 0.]])
>>> sparse.spdiags(np.ones(9)*[[-1],[1]], [0,1],9,10).A.shape
(9, 10)
八度音
>full(spdiags([-ones(9,1) ones(9,1)],[0 1],9,10))
ans =
-1 1 0 0 0 0 0 0 0 0
0 -1 1 0 0 0 0 0 0 0
0 0 -1 1 0 0 0 0 0 0
0 0 0 -1 1 0 0 0 0 0
0 0 0 0 -1 1 0 0 0 0
0 0 0 0 0 -1 1 0 0 0
0 0 0 0 0 0 -1 1 0 0
0 0 0 0 0 0 0 -1 1 0
0 0 0 0 0 0 0 0 -1 1
>size(full(spdiags([-ones(9,1) ones(9,1)],[0 1],9,10)))
ans =
9 10
为什么 scipy 和 Octave 在最后一行的最后一列给出的值不同?
【问题讨论】:
标签: python scipy octave sparse-matrix diagonal