расчет расстояния Римана для двух матриц ковариации А и В в Matlab является:OpenCV - Как я могу рассчитать расстояние Римана с помощью C++?
C = sqrt(sum(log(eig(A,B)).^2))
Что является эквивалентом для OpenCV с C++?
расчет расстояния Римана для двух матриц ковариации А и В в Matlab является:OpenCV - Как я могу рассчитать расстояние Римана с помощью C++?
C = sqrt(sum(log(eig(A,B)).^2))
Что является эквивалентом для OpenCV с C++?
Теперь я получил те же результаты, что и Matlab. Следит мое решение C++:
double calculateRiemannianDistance(cv::Mat A, cv::Mat B) {
Eigen::MatrixXf e_A, e_B;
cv::cv2eigen(A, e_A);
cv::cv2eigen(B, e_B);
/* compute generalized eigenvalues */
Eigen::GeneralizedEigenSolver<Eigen::MatrixXf> ges;
ges.compute(e_A, e_B);
cv::Mat gev;
cv::eigen2cv(Eigen::MatrixXf(ges.eigenvalues().real()), gev);
/* riemannian distance */
cv::Mat partial_res;
cv::log(gev, partial_res);
cv::pow(partial_res, 2, partial_res);
double distance = sqrt(cv::sum(partial_res)[0]);
return distance;
}
Кстати, что такое римановое расстояние? и его использования? –
@ JeruLuke, я использовал римановое расстояние, чтобы вычислить расстояние между двумя разными ковариационными матрицами, так как они не принадлежат к евклидову пространству. –
Так что это полезно для статистических выводов ... правильно? –
Все необходимые методы существуют в OpenCV см http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html, так что вы пробовали? –
Моей основной задачей является вычисление обобщенных собственных значений из двух ковариационных матриц (eig (A, B)) в OpenCV. –
Хорошо, это может вам помочь: http://www.developerstation.org/2012/04/general-eigen-values-and-eigen-vectors.html –