Я использую библиотеку Eigen для вычисления среднего угла между двумя векторами Vector3ds. Должен быть способ быстрее, чем пробовать каждую комбинацию «вручную»?
double average_angle(const std::vector<Eigen::Vector3d>& v1, const std::vector<Eigen::Vector3d>& v2)
{
double result = 0;
for (const auto& v1_entry : v1)
{
for (const auto& v2_entry : v2)
{
result += acos(v1_entry.dot(v2_entry));
}
}
const auto item_count = v1.size() * v2.size();
return result / item_count;
}
К сожалению, они могут быть совершенно разными, поэтому надежно работать не будет.
Я также попытался усреднить все скалярные произведения вместе и взять их общую картину. Хотя, похоже, это не работает.
Результат во многом зависит от данных векторов. В некоторых странных случаях вы получите абсурдные результаты. Вот почему я думаю, вы должны рассказать нам о своей «настоящей» проблеме.





Более элегантная версия:
Matrix3Xd::Map M1(v1[0].data(), 3, v1.size();
Matrix3Xd::Map M2(v2[0].data(), 3, v2.size();
return (M1.transpose() * M2).diagonal().array().acos().mean();
но не ожидайте, что это будет быстрее, поскольку это будет сводиться к тому же коду.
Что вы пытаетесь решить? В случае, когда все векторы в
v1«похожи» и одинаковы дляv2, возможно, вам подходит угол между средними векторами.