def karcher_calc(beta, q, betamean, mu, basis, mode): # Compute shooting vector from mu to q_i w, d = cf.inverse_exp_coord(betamean, beta, mode) # Project to tangent space of manifold to obtain v_i if mode == 0: v = w else: v = cf.project_tangent(w, q, basis) return (v, d)
def karcher_calc(beta, q, betamean, mu, mode=0): if mode == 1: basis = cf.find_basis_normal(mu) # Compute shooting vector from mu to q_i w, d = cf.inverse_exp_coord(betamean, beta) # Project to tangent space of manifold to obtain v_i if mode == 0: v = w else: v = cf.project_tangent(w, q, basis) return(v, d)
def curve_karcher_cov(betamean, beta, mode='O'): """ This claculates the mean of a set of curves :param betamean: numpy ndarray of shape (n, M) describing the mean curve :param beta: numpy ndarray of shape (n, M, N) describing N curves in R^M :param mode: Open ('O') or closed curve ('C') (default 'O') :rtype: tuple of numpy array :return K: Covariance Matrix """ n, T, N = beta.shape modes = ['O', 'C'] mode = [i for i, x in enumerate(modes) if x == mode] if len(mode) == 0: mode = 0 else: mode = mode[0] # Compute Karcher covariance of uniformly sampled mean betamean = cf.resamplecurve(betamean, T) mu = cf.curve_to_q(betamean) if mode == 1: mu = cf.project_curve(mu) basis = cf.find_basis_normal(mu) v = zeros((n, T, N)) for i in range(0, N): beta1 = beta[:, :, i] w, dist = cf.inverse_exp_coord(betamean, beta1) # Project to the tangent sapce of manifold to obtain v_i if mode == 0: v[:, :, i] = w else: v[:, :, i] = cf.project_tangent(w, mu, basis) K = zeros((2*T, 2*T)) for i in range(0, N): w = v[:, :, i] wtmp = w.reshape((T*n, 1), order='C') K = K + wtmp.dot(wtmp.T) K = K/(N-1) return(K)
def curve_karcher_cov(betamean, beta, mode='O'): """ This claculates the mean of a set of curves :param betamean: numpy ndarray of shape (n, M) describing the mean curve :param beta: numpy ndarray of shape (n, M, N) describing N curves in R^M :param mode: Open ('O') or closed curve ('C') (default 'O') :rtype: tuple of numpy array :return K: Covariance Matrix """ n, T, N = beta.shape modes = ['O', 'C'] mode = [i for i, x in enumerate(modes) if x == mode] if len(mode) == 0: mode = 0 else: mode = mode[0] # Compute Karcher covariance of uniformly sampled mean betamean = cf.resamplecurve(betamean, T) mu = cf.curve_to_q(betamean) if mode == 1: mu = cf.project_curve(mu) basis = cf.find_basis_normal(mu) v = zeros((n, T, N)) for i in range(0, N): beta1 = beta[:, :, i] w, dist = cf.inverse_exp_coord(betamean, beta1) # Project to the tangent sapce of manifold to obtain v_i if mode == 0: v[:, :, i] = w else: v[:, :, i] = cf.project_tangent(w, mu, basis) K = zeros((2*T, 2*T)) for i in range(0, N): w = v[:, :, i] wtmp = w.reshape((T*n, 1), order='C') K = K + wtmp.dot(wtmp.T) K = K/(N-1) return(K)