Source code for monalisa.trajectory._traj_grid_step
"""Port of src/traj123/bmTraj_dK_u.m."""
import numpy as np
from monalisa._mat import isempty, msize, vec
from monalisa.array._point_reshape import point_reshape
from monalisa.trajectory._traj_grid_size import traj_grid_size
from monalisa.trajectory._traj_n_line import traj_n_line
def _dK_n(t):
_, _, _, dK_n = traj_n_line(t, nargout=4)
dK_n = dK_n.ravel()
med = np.median(dK_n)
dK_n = dK_n[~(dK_n > 2 * med)]
dK_n = dK_n[~(dK_n < 0.5 * med)]
return np.median(dK_n)
[docs]
def traj_grid_step(t, N_u=None):
"""Guess the Cartesian grid step ``dK_u`` from the trajectory extent."""
if isempty(N_u):
N_u = traj_grid_size(t)
N_u = vec(N_u)
t = np.asarray(point_reshape(t))
imDim = msize(t, 1)
dK = [abs(t[i, :].max() - t[i, :].min()) / (N_u[i] - 1) for i in range(imDim)]
if imDim == 2:
if abs(dK[0] - dK[1]) / max(dK[0], dK[1]) < 0.02:
dK = [_dK_n(t)] * 2
elif imDim == 3:
d = [abs(dK[0] - dK[1]) / max(dK[0], dK[1]),
abs(dK[1] - dK[2]) / max(dK[1], dK[2]),
abs(dK[2] - dK[0]) / max(dK[2], dK[0])]
if max(d) < 0.02:
dK = [_dK_n(t)] * 3
return np.array([dK], dtype=np.result_type(*dK, np.float32))