def sample_invwishart(S,nu):
# TODO make a version that returns the cholesky
# TODO allow passing in chol/cholinv of matrix parameter lmbda
# TODO lowmem! memoize! dchud (eigen?)
n = S.shape[0]
chol = np.linalg.cholesky(S)
if (nu <= 81+n) and (nu == np.round(nu)):
x = np.random.randn(nu,n)
else:
x = np.diag(np.sqrt(np.atleast_1d(stats.chi2.rvs(nu-np.arange(n)))))
x[np.triu_indices_from(x,1)] = np.random.randn(n*(n-1)/2)
R = np.linalg.qr(x,'r')
T = scipy.linalg.solve_triangular(R.T,chol.T,lower=True).T
return np.dot(T,T.T)
评论列表
文章目录