|
|
@ -1332,43 +1332,23 @@ def mctp2tc(f_Mm, utc, param, f_mM=None):
|
|
|
|
f_tc = the matrix with frequences of upcrossing troughs and crests,
|
|
|
|
f_tc = the matrix with frequences of upcrossing troughs and crests,
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
# raise NotImplementedError('')
|
|
|
|
def _check_ntc(ntc, n):
|
|
|
|
if f_mM is None:
|
|
|
|
|
|
|
|
f_mM = np.copy(f_Mm)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u = np.linspace(*param)
|
|
|
|
|
|
|
|
udisc = np.fliplr(u)
|
|
|
|
|
|
|
|
ntc = np.sum(udisc >= utc)
|
|
|
|
|
|
|
|
n = len(f_Mm)
|
|
|
|
|
|
|
|
if ntc > n - 1:
|
|
|
|
if ntc > n - 1:
|
|
|
|
raise IndexError('index for mean-level out of range, stop')
|
|
|
|
raise IndexError('index for mean-level out of range, stop')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _check_discretization(param, ntc):
|
|
|
|
if param[2] - 1 < ntc or ntc < 2:
|
|
|
|
if param[2] - 1 < ntc or ntc < 2:
|
|
|
|
raise ValueError('the reference level out of range, stop')
|
|
|
|
raise ValueError('the reference level out of range, stop')
|
|
|
|
|
|
|
|
|
|
|
|
# normalization of frequency matrices
|
|
|
|
def _normalize_rows(arr):
|
|
|
|
|
|
|
|
n = len(arr)
|
|
|
|
for i in range(n):
|
|
|
|
for i in range(n):
|
|
|
|
rowsum = np.sum(f_Mm[i])
|
|
|
|
rowsum = np.sum(arr[i])
|
|
|
|
if rowsum != 0:
|
|
|
|
if rowsum != 0:
|
|
|
|
f_Mm[i] = f_Mm[i] / rowsum
|
|
|
|
arr[i] = arr[i] / rowsum
|
|
|
|
|
|
|
|
return arr
|
|
|
|
|
|
|
|
|
|
|
|
P = np.fliplr(f_Mm)
|
|
|
|
def _make_tempp(P, Ph, i, ntc):
|
|
|
|
|
|
|
|
|
|
|
|
Ph = np.rot90(np.fliplr(f_mM), -1)
|
|
|
|
|
|
|
|
for i in range(n):
|
|
|
|
|
|
|
|
rowsum = np.sum(Ph[i])
|
|
|
|
|
|
|
|
if rowsum != 0:
|
|
|
|
|
|
|
|
Ph[i] = Ph[i] / rowsum
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ph = np.fliplr(Ph)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F = np.zeros((n, n))
|
|
|
|
|
|
|
|
F[:ntc - 1, :(n - ntc)] = f_mM[:ntc - 1, :(n - ntc)]
|
|
|
|
|
|
|
|
F = cmat2nt(F)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in range(1, ntc):
|
|
|
|
|
|
|
|
for j in range(ntc, n - 1):
|
|
|
|
|
|
|
|
if i < ntc:
|
|
|
|
|
|
|
|
Ap = P[i:ntc - 1, i + 1:ntc]
|
|
|
|
Ap = P[i:ntc - 1, i + 1:ntc]
|
|
|
|
Bp = Ph[i + 1:ntc, i:ntc - 1]
|
|
|
|
Bp = Ph[i + 1:ntc, i:ntc - 1]
|
|
|
|
dim_p = ntc - i
|
|
|
|
dim_p = ntc - i
|
|
|
@ -1388,8 +1368,9 @@ def mctp2tc(f_Mm, utc, param, f_mM=None):
|
|
|
|
|
|
|
|
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
return tempp
|
|
|
|
elif j > ntc:
|
|
|
|
|
|
|
|
|
|
|
|
def _make_tempm(P, Ph, j, ntc):
|
|
|
|
Am = P[ntc:j - 1, ntc + 1:j]
|
|
|
|
Am = P[ntc:j - 1, ntc + 1:j]
|
|
|
|
Bm = Ph[ntc + 1:j, ntc:j - 1]
|
|
|
|
Bm = Ph[ntc + 1:j, ntc:j - 1]
|
|
|
|
dim_m = j - ntc
|
|
|
|
dim_m = j - ntc
|
|
|
@ -1408,34 +1389,59 @@ def mctp2tc(f_Mm, utc, param, f_mM=None):
|
|
|
|
tempm = np.dot(Bm, linalg.lstsq(rh, em)[0])
|
|
|
|
tempm = np.dot(Bm, linalg.lstsq(rh, em)[0])
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
|
|
|
|
return tempm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if f_mM is None:
|
|
|
|
|
|
|
|
f_mM = np.copy(f_Mm)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u = np.linspace(*param)
|
|
|
|
|
|
|
|
udisc = np.fliplr(u)
|
|
|
|
|
|
|
|
ntc = np.sum(udisc >= utc)
|
|
|
|
|
|
|
|
n = len(f_Mm)
|
|
|
|
|
|
|
|
_check_ntc(ntc, n)
|
|
|
|
|
|
|
|
_check_discretization(param, ntc)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# normalization of frequency matrices
|
|
|
|
|
|
|
|
f_Mm = _normalize_rows(f_Mm)
|
|
|
|
|
|
|
|
P = np.fliplr(f_Mm)
|
|
|
|
|
|
|
|
Ph = np.rot90(np.fliplr(f_mM), -1)
|
|
|
|
|
|
|
|
Ph = _normalize_rows(Ph)
|
|
|
|
|
|
|
|
Ph = np.fliplr(Ph)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F = np.zeros((n, n))
|
|
|
|
|
|
|
|
F[:ntc - 1, :(n - ntc)] = f_mM[:ntc - 1, :(n - ntc)]
|
|
|
|
|
|
|
|
F = cmat2nt(F)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in range(1, ntc):
|
|
|
|
|
|
|
|
for j in range(ntc-1, n - 1):
|
|
|
|
|
|
|
|
if i < ntc-1:
|
|
|
|
|
|
|
|
tempp = _make_tempp(P, Ph, i, ntc)
|
|
|
|
|
|
|
|
b = np.dot(np.dot(tempp.T, f_mM[i:ntc - 1, n - j:-1:-1]),
|
|
|
|
|
|
|
|
ones((n - j, 1)))
|
|
|
|
|
|
|
|
# end
|
|
|
|
|
|
|
|
if j > ntc-1:
|
|
|
|
|
|
|
|
tempm = _make_tempm(P,Ph, j, ntc)
|
|
|
|
|
|
|
|
c = np.dot(np.dot(ones((1, i - 1)),
|
|
|
|
|
|
|
|
f_mM[:i - 1, n - ntc:n - j + 1:-1]),
|
|
|
|
|
|
|
|
tempm)
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
|
|
|
|
|
|
|
|
if (j > ntc) and (i < ntc):
|
|
|
|
if (j > ntc-1) and (i < ntc-1):
|
|
|
|
a = np.dot(np.dot(tempp.T,
|
|
|
|
a = np.dot(np.dot(tempp.T,
|
|
|
|
f_mM[i:ntc - 1, n - ntc:-1:n - j + 1]),
|
|
|
|
f_mM[i:ntc - 1, n - ntc:-1:n - j + 1]),
|
|
|
|
tempm)
|
|
|
|
tempm)
|
|
|
|
b = np.dot(np.dot(tempp.T, f_mM[i:ntc - 1, n - j:-1:1]),
|
|
|
|
|
|
|
|
ones((n - j, 1)))
|
|
|
|
|
|
|
|
c = np.dot(np.dot(ones((1, i - 1)),
|
|
|
|
|
|
|
|
f_mM[1:i - 1, n - ntc:-1:n - j + 1]),
|
|
|
|
|
|
|
|
tempm)
|
|
|
|
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + a + b + c
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + a + b + c
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
if (j == ntc) and (i < ntc):
|
|
|
|
if (j == ntc-1) and (i < ntc-1):
|
|
|
|
b = np.dot(np.dot(tempp.T, f_mM[i:ntc - 1, n - j:-1:1]),
|
|
|
|
|
|
|
|
ones((n - j, 1)))
|
|
|
|
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + b
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + b
|
|
|
|
for k in range(ntc):
|
|
|
|
for k in range(ntc):
|
|
|
|
F[i, n - k + 1] = F[i, n - ntc + 1]
|
|
|
|
F[i, n - k + 1] = F[i, n - ntc + 1]
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
if (j > ntc) and (i == ntc):
|
|
|
|
if (j > ntc-1) and (i == ntc-1):
|
|
|
|
c = np.dot(np.dot(ones((1, i - 1)),
|
|
|
|
|
|
|
|
f_mM[1:i - 1, n - ntc:-1:n - j + 1]),
|
|
|
|
|
|
|
|
tempm)
|
|
|
|
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + c
|
|
|
|
F[i, n - j + 1] = F[i, n - j + 1] + c
|
|
|
|
for k in range(ntc, n):
|
|
|
|
for k in range(ntc-1, n):
|
|
|
|
F[k, n - j + 1] = F[ntc, n - j + 1]
|
|
|
|
F[k, n - j + 1] = F[ntc-1, n - j + 1]
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|
# end
|
|
|
|