在Matlab中/八度音功能不是,spdiags([-8037.500 50.000 -12.500], 0:2, 1, 51)
给出以下输出:spdiags()如预期工作在Python
(1, 1) -> -8037.5
(1, 2) -> 50
(1, 3) -> -12.500
然而,当我使用在Python下面,它不会产生类似的结果作为在Matlab /八度:
Python的spdiags()产生下面的输出,这是在缺少一号50
和-12.5
条款和第二指数:
array([[-8037.5, 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. ]])
我看了一下this对一个类似问题的回答,但我不确定我哪里出错了。
编辑:
我想建立如下图所示的是由A_diag1
,A_diag2
和A_diag3
矩阵A
。按照答案中的建议,我定义了A_diag1
和A_diag3
。
import numpy as np
import scipy as sp
A_diag1 = np.tile(np.array([-8037.500, 50, -12.5]), (3,1))
A_diag2 = np.reshape(np.repeat([1250, -18505, 1250], 49), (3, 49))
A_diag3 = np.tile(np.array([12.5, -50, 8037.500]), (3,1))
A = np.concatenate((sp.sparse.spdiags(A_diag1, np.r_[0:2 + 1], 1, 51).toarray(), \
sp.sparse.spdiags(A_diag2, np.r_[0:2 + 1], 49, 51).toarray(), \
sp.sparse.spdiags(A_diag3, np.r_[48:50 + 1], 1, 51).toarray()), axis=0)
然而,五显现细胞在过去的3行和A
列显示为零/单数显示在下面的快照。我预计当前显示为零的突出显示的单元格不为零。 [您可以复制并粘贴上面的代码片段以再现A
矩阵,从中可以获取如下所示的快照。]
EDIT2:
继使用sp.sparse.diags()
按预期工作代码。与sp.sparse.spdiags
不同,使用sp.sparse.diags()
时,输入参数的结果形状(数组维数)必须在列表中。
import numpy as np
import scipy as sp
A_diag1 = np.array([[-8037.500], [50], [-12.5]])
A_diag2 = np.reshape(np.repeat([1250, -18505, 1250], 49), (3, 49))
A_diag3 = np.array([[12.5], [-50], [8037.500]])
A = np.concatenate((sp.sparse.diags(A_diag1, np.arange(0, 2 + 1), [1, 51]).toarray(), \
sp.sparse.diags(A_diag2, np.arange(0, 2 + 1), [49, 51]).toarray(), \
sp.sparse.diags(A_diag3, np.arange(48, 50 + 1), [1, 51]).toarray()), axis=0)
谢谢。你能否看看为什么在编辑下描述的矩阵'A'没有按预期给出正确的输出? – user11
'sparse.diags'可能是您想要使用的函数,而不是'spdiags'。 – hpaulj
是的,'sp.sparse.diags'按照建议运行良好。谢谢。 – user11