<p>第1步:正确计算</p>
<p>第二步:收集到一个</p>
<hr/>
<p>我想你要计算的是</p>
<p><a href="https://i.stack.imgur.com/cYIhD.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/cYIhD.gif" alt="enter image description here"/></a></p>
<p>一个简单的方法是使用屏蔽数组屏蔽条目。这样我们就不需要删除或复制任何矩阵</p>
<pre><code># sample
x = np.array([1,2,3,4])
s = np.diag([4,5,6,7])
# we will use masked arrays to remove k=i
vec_mask = np.zeros_like(x)
matrix_mask = np.zeros_like(s)
i = 0 # start
# set masks
vec_mask[i] = 1
matrix_mask[i] = matrix_mask[:,i] = 1
s_mask = np.ma.array(s, mask=matrix_mask)
x_mask = np.ma.array(x, mask=vec_mask)
# reduced product, remember using np.ma.inner instead np.inner
Ai = np.ma.inner(np.ma.inner(x_mask, s_mask), x_mask.T)
vec_mask[i] = 0
matrix_mask[i] = matrix_mask[:,i] = 0
</code></pre>
<p>由于<code>0</code>的项不会加到和中,我们实际上可以忽略屏蔽矩阵,而只屏蔽向量:</p>
<pre><code># we will use masked arrays to remove k=i
mask = np.zeros_like(x)
i = 0 # start
# set masks
mask[i] = 1
x_mask = np.ma.array(x, mask=mask)
# reduced product
Ai = np.ma.inner(np.ma.inner(x_mask, s), x_mask.T)
# unset mask
mask[i] = 0
</code></pre>
<hr/>
<p>最后一步是将<code>A</code>从<code>A_i</code>中组装出来,所以我们总共得到</p>
<pre><code>x = np.array([1,2,3,4])
s = np.diag([4,5,6,7])
mask = np.zeros_like(x)
x_mask = np.ma.array(x, mask=mask)
A = []
for i in range(len(x)):
x_mask.mask[i] = 1
Ai = np.ma.inner(np.ma.inner(x_mask, s), x_mask.T)
A.append(Ai)
x_mask.mask[i] = 0
A_vec = np.array(A)
</code></pre>