def compute_distance(self, xi: GrassmannPoint, xj: GrassmannPoint): GrassmannianDistance.check_rows(xi, xj) rank_i = xi.data.shape[1] rank_j = xj.data.shape[1] r = np.dot(xi.data.T, xj.data) (ui, si, vi) = np.linalg.svd(r, full_matrices=True) si[np.where(si > 1)] = 1.0 theta = np.arccos(si) return np.sqrt(abs(rank_i - rank_j) * np.pi**2 / 4 + np.sum(theta**2))
def compute_distance(self, xi: GrassmannPoint, xj: GrassmannPoint) -> float: """ Compute the Asimov distance between two points on the Grassmann manifold. :param xi: Orthonormal matrix representing the first point. :param xj: Orthonormal matrix representing the second point. """ GrassmannianDistance.check_rows(xi, xj) r = np.dot(xi.data.T, xj.data) (ui, si, vi) = np.linalg.svd(r, full_matrices=True) si[np.where(si > 1)] = 1.0 theta = np.arccos(si) distance = np.max(theta) return distance
def compute_distance(self, xi: GrassmannPoint, xj: GrassmannPoint) -> float: """ Compute the Projection distance between two points on the Grassmann manifold. :param xi: Orthonormal matrix representing the first point. :param xj: Orthonormal matrix representing the second point. """ GrassmannianDistance.check_rows(xi, xj) rank_i = xi.data.shape[1] rank_j = xj.data.shape[1] r = np.dot(xi.data.T, xj.data) (ui, si, vi) = np.linalg.svd(r, full_matrices=True) si[np.where(si > 1)] = 1.0 theta = np.arccos(si) distance = np.sqrt(abs(rank_i - rank_j) + np.sum(np.sin(theta) ** 2)) return distance
def compute_distance(self, xi: GrassmannPoint, xj: GrassmannPoint) -> float: """ Compute the Martin distance between two points on the Grassmann manifold. :param xi: Orthonormal matrix representing the first point. :param xj: Orthonormal matrix representing the second point. """ GrassmannianDistance.check_rows(xi, xj) r = np.dot(xi.data.T, xj.data) (ui, si, vi) = np.linalg.svd(r, full_matrices=True) si[np.where(si > 1)] = 1.0 theta = np.arccos(si) cos_sq = np.cos(theta)**2 float_min = sys.float_info.min index = np.where(cos_sq < float_min) cos_sq[index] = float_min recp = np.reciprocal(cos_sq) distance = np.sqrt(np.log(np.prod(recp))) return distance