def _solve_2D2(self, X, Z):
"""Solves :math:`Z^T N^{-1}X`, where :math:`X`
and :math:`Z` are 2-d arrays.
"""
ZNX = np.dot(Z.T / self._nvec, X)
for slc, jv in zip(self._slices, self._jvec):
if slc.stop - slc.start > 1:
Zblock = Z[slc, :]
Xblock = X[slc, :]
niblock = 1 / self._nvec[slc]
beta = 1.0 / (np.einsum('i->', niblock)+1.0/jv)
zn = np.dot(niblock, Zblock)
xn = np.dot(niblock, Xblock)
ZNX -= beta * np.outer(zn.T, xn)
return ZNX
评论列表
文章目录