<p>所有3个版本的计算结果应该相同,这是正确的。可能有一些
由于浮点运算既不是关联的,也不是分布的,所以有变化:</p>
<pre><code>In [147]: ((0.1+0.2)+0.3) != (0.1+(0.2+0.3))
Out[147]: True
In [153]: 0.3*(0.1+0.2) != 0.3*0.1 + 0.3*0.2
Out[153]: True
</code></pre>
<p>把它和大数相乘结合起来:</p>
<pre><code>In [164]: 1e15 * ((0.1+0.2)+0.3) - 1e15 * (0.1+(0.2+0.3))
Out[164]: 0.125
</code></pre>
<p>这种差异可能会变得显著。你知道吗</p>
<p>但在典型情况下,您的代码按预期工作:</p>
<pre><code>import numpy as np
import scipy.sparse as sparse
# np.random.seed(2019)
K, M, N, P = 100, 200, 300, 400
AT = sparse.random(K, M, density=0.001, format='csc')
y_k = sparse.random(M, P, density=0.001, format='csc')
t_k = np.exp(1)
AHAT_inv = sparse.random(M, N, density=0.001, format='csc')
b = sparse.random(N, P, density=0.0001, format='csc')
c = sparse.random(K, P, density=0.001, format='csc')
s_k_control = c - (AT.dot(y_k) + AT.dot(t_k * (AHAT_inv.dot(b))))
print("SK_control 1:", s_k_control.min())
s_k_control = c - AT.dot(y_k + (t_k * (AHAT_inv.dot(b))))
print("SK_control 2:", s_k_control.min())
y_k_1 = y_k + t_k * (AHAT_inv.dot(b))
s_k_control = c - AT.dot(y_k_1)
print("SK_control 3:", s_k_control.min())
</code></pre>
<p>打印结果,例如</p>
<pre><code>SK_control 1: -0.6701900742964602
SK_control 2: -0.6701900742964602
SK_control 3: -0.6701900742964602
</code></pre>
<p>对我们进一步调查你的情况,如果你
可以产生一个可运行的,可复制的例子来证明这种差异。你知道吗</p>
<hr/>
<p>请注意,有一个<a href="https://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information" rel="nofollow noreferrer">warning in the docs</a>强烈反对将NumPy函数直接应用于稀疏矩阵,“<em>因为NumPy可能无法正确地将它们转换为计算,从而导致意外(和不正确的)结果”。可用时使用稀疏矩阵方法。因此,使用<code>s_k_control.min()</code>代替<code>np.min(s_k_control)</code>。你知道吗</p>
<p>如果不可用,并且无法设计其他方法,建议在应用任何NumPy函数之前将稀疏矩阵转换为NumPy数组。你知道吗</p>
<p>在您的案例中,这个问题似乎不是问题的原因,但需要注意。你知道吗</p>