File size: 870 Bytes
4adaccc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import numpy as np
g = 4
h =4
def _toeplitz_rect(g, h, gamma):
i = np.arange(g)[:, None]
j = np.arange(h)[None, :]
return gamma ** np.abs(i - j)
def sample_X(rng, rows, rho, gamma):
print(rho, gamma)
if np.isclose(rho, 0) and np.isclose(gamma,0):
return rng.standard_normal((rows, g+h))
Tg = _toeplitz_rect(g, g, gamma)
Th = _toeplitz_rect(h, h, gamma)
Tgh = _toeplitz_rect(g, h, gamma)
S = np.block([[Tg, rho * Tgh], [rho * Tgh.T, Th]])
L = np.linalg.cholesky(S)
assert np.isfinite(L).all()
Z = rng.standard_normal((rows, g + h))
A = Z @ L.T
assert np.isfinite(A).all()
return A
rng = np.random.default_rng(4)
# sample_X(rng, 30, 0, 1) # 0 and 1 block
sample_X(rng, 10, 0, 0) # Id
sample_X(rng, 10, 0, .3) # diagonal toeplitz block
sample_X(rng, 10, 0.5, 0) # block
sample_X(rng, 10, 0.5, .5)
|