回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在Matlab/Octave中,<code>spdiags([-8037.500 50.000 -12.500], 0:2, 1, 51)</code>给出以下输出:</p>
<pre><code>(1, 1) -> -8037.5
(1, 2) -> 50
(1, 3) -> -12.500
</code></pre>
<p>但是,当我在Python中使用以下命令时,它不会产生类似于Matlab/Octave的结果:</p>
^{pr2}$
<p>Python的<a href="https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.diags.html" rel="nofollow noreferrer">spdiags()</a>生成以下输出,其中缺少第1和第2个索引中的<code>50</code>和<code>-12.5</code>项:</p>
<pre><code>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. ]])
</code></pre>
<p>我看了一个类似问题的<a href="https://stackoverflow.com/a/31900194/8092075">this</a>答案,但我不确定我错在哪里。在</p>
<p><strong>编辑:</strong></p>
<p>我试图构建一个矩阵<code>A</code>,它由<code>A_diag1</code>,<code>A_diag2</code>,和{<cd7>}组成,如下所示。我已经定义了<code>A_diag1</code>和{<cd7>},正如答案中所建议的那样。在</p>
<pre><code>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)
</code></pre>
<p>但是,<code>A</code>最后3行和列中的5个高亮显示的单元格显示为0/单数,如下面的快照所示。我希望那些高亮显示的单元格(当前显示为零)为非零。[<strong><em>您只需复制并粘贴上面的代码片段来复制<code>A</code>矩阵,下面显示的快照就是从这个矩阵中获取的。</em></strong>]</p>
<p><a href="https://i.stack.imgur.com/C6vcX.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/C6vcX.png" alt="enter image description here"/></a></p>
<p><strong>编辑2:</strong></p>
<p>下面使用<code>sp.sparse.diags()</code>的代码按预期工作。与<code>sp.sparse.spdiags</code>不同,使用<code>sp.sparse.diags()</code>时结果形状(数组维度)的输入参数必须在列表中。在</p>
<pre><code>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)
</code></pre>