11.12. Вычисление расстояния между векторами
11.12. Вычисление расстояния между векторами
Проблема
Требуется найти евклидово расстояние между векторами.
Решение
Евклидово расстояние между векторами определяется как квадратный корень суммы квадратов разностей соответствующих элементов. Рассчитать его можно так, как показано в примере 11.22.
Пример 11.22. Расчет расстояния между двумя векторами
#include <cmath>
#include <iostream>
using namespace std;
template<class Iter_T, class Iter2_T>
double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {
double ret = 0.0;
while (first != last) {
double dist = (*first++) - (*first2++);
ret += dist * dist;
}
return ret > 0.0 ? sqrt(ret) : 0.0;
}
int main() {
int v1[] = { 1, 5 };
int v2[] = { 4, 9 };
cout << "distance between vectors (1,5) and (4,9) is ";
cout << vectorDistance(v1, v1 + 2, v2) << endl;
}
Программа примера 11.22 выдает следующий результат.
distance between vectors (1,5) and (4,9) is 5
Обсуждение
Пример 11.22 реализует прямое решение, которое показывает, как следует писать простую обобщенную функцию в стиле STL. Для расчета расстояний между векторами я мог бы использовать функцию inner_product, однако я не стал использовать функтор, потому что это неоправданно усложнило бы решение. Пример 11.23 показывает, как можно рассчитывать расстояние между векторами, применяя функтор и функцию inner_product из заголовочного файла <numeric>.
Пример 11.23. Расчет расстояния между векторами с использованием функции inner_product
#include <numeric>
#include <cmath>
#include <iostream>
#include <functional>
using namespace std;
template<class Value_T>
struct DiffSquared {
Value_T operator()(Value_T x, Value_T y) const {
return (x - y) * (x - y);
}
};
template<class Iter_T, class Iter2_T>
double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {
double ret = inner_product(first, last, first2, 0.0L,
plus<double>(), DiffSquared<double>());
return ret > 0.0 ? sqrt(ret) : 0.0;
}
int main() {
int v1[] = { 1, 5 };
int v2[] = { 4, 9 };
cout << "distance between vectors (1,5) and (4,9) is ";
cout << vectorDistance(v1, v1 + 2, v2) << endl;
}
Поскольку реализация функции inner_product() может быть специально оптимизирована для вашей платформы и вашего компилятора, я предпочитаю ее использовать везде, где это возможно.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Вычисление постоянных
Вычисление постоянных Вот что мы собираемся сделать: пройтись по всем объявлениям стилей и заменить вычисление выражения его постоянным значением. В предыдущем примере, предполагая, что мы используем IE6 в стандартном режиме, нам хотелось бы видеть следующий код:#myDiv {border:
8.4.1 Протоколы вектора расстояния
8.4.1 Протоколы вектора расстояния Самый простой протокол для сравнения маршрутизаторов использует счет попаданий между конечными точками пути. Некоторые улучшенные варианты оценивают стоимость или вес каждого из участков по пути следования. Например, участок попадания
Вычисление площади и периметра
Вычисление площади и периметра Команда AREA вычисляет площадь и периметр объекта или заданной области. Вызывается из падающего меню Tools ? Inquiry ? Area или щелчком на пиктограмме Area на панели инструментов Inquiry.Воображаемая фигура, предназначенная для вычисления площади и
Регулировка расстояния
Регулировка расстояния Команда 3DDISTANCE устанавливает режим интерактивного трехмерного просмотра, приближение к объектам и удаление от них. Команда вызывается из падающего меню View ? Camera ? Adjust Distance или щелчком на пиктограмме Adjust Distance на плавающей панели инструментов Camera
2.36. Вычисление расстояния Левенштейна между двумя строками
2.36. Вычисление расстояния Левенштейна между двумя строками Расстояние между строками важно знать в индуктивном обучении (искусственный интеллект), криптографии, исследовании структуры белков и других областях.Расстоянием Левенштейна называется минимальное число
7.17. Вычисление разности между двумя моментами времени
7.17. Вычисление разности между двумя моментами времени Можно вычислить интервал между двумя моментами времени. В результате вычитания одного объекта Time из другого получаем число секунд:today = Time.local(2000,11,10)yesterday = Time.local(2000,11,9)cliff = today - yesterday # 86400 секунд.И снова оказывается
Совет 23. Рассмотрите возможность замены ассоциативных контейнеров сортированными векторами
Совет 23. Рассмотрите возможность замены ассоциативных контейнеров сортированными векторами Многие программисты STL, столкнувшись с необходимостью структуры данных с быстрым поиском, немедленно выбирают стандартные ассоциативные контейнеры set, multiset, map и multimap. В этом
Регулировка расстояния
Регулировка расстояния Команда 3DDISTANCE устанавливает режим интерактивного трехмерного просмотра, приближение к объектам и удаление от них. Команда вызывается из падающего меню View ? Camera ? Adjust Distance или щелчком на пиктограмме Adjust Distance на плавающей панели инструментов
Регулировка расстояния
Регулировка расстояния Команда 3DDISTANCE устанавливает режим интерактивного трехмерного просмотра, приближение к объектам и удаление от них. Команда вызывается из падающего меню View ? Camera ? Adjust Distance или щелчком на пиктограмме Adjust Distance на плавающей панели инструментов Camera
2.3.9. Вычисление размера БД
2.3.9. Вычисление размера БД ERwin позволяет рассчитать приблизительный размер БД в целом, а также таблиц, индексов и других объектов через определенный период времени после начала эксплуатации ИС. Для расчета размеров физических объектов служит диалог Volumetrics Editor (рис. 2.99),
Вычисление номеров
Вычисление номеров Пожалуй, самым простым для понимания (но не самым простым в использовании) способом вычисления номера является использование XPath-выражений. Этот способ практически идентичен использованию xsl:value-of, как было показано в начале этой главы. Единственным
5.2.1. Вычисление максимума
5.2.1. Вычисление максимума Процедуру нахождения наибольшего из двух чисел можно запрограммировать в виде отношенияmах( X, Y, Мах)где Мах = X, если X больше или равен Y, и Мах есть Y, если X меньше Y. Это соответствует двум таким предложениям:mах( X, Y, X) :- X >= Y.max( X, Y, Y) :- X < Y.Эти
Расстояния между словами и строками, поля
Расстояния между словами и строками, поля В почерке отчетливо проявляется тенденция к расточительности или скупости. Существуют два способа, позволяющих определить способности человека к управлению финансами.Во-первых, надо проанализировать расстояние между словами и
6. Расстояния
6. Расстояния Признаки слева направо (рис. 186):• расстояния между словами маленькие, слова написаны тесно;• расстояния между словами большие, слова стоят широко;• расстояния между строками достаточно большие, пропорциональные;• расстояния между строками маленькие; Рис.