Я боролся с алгоритмом, связанным с сопоставлениями с векторами трехмерного треугольника. К сожалению, он очень медленный в местах, и я пошел туда и обратно по различным методам, чтобы попытаться его улучшить. Одна вещь, с которой я борюсь, - это ускорение расчета расстояния.Способ ускорения вычисления расстояния между вершинами с помощью numpy
У меня есть две группы треугольников, которые были разбиты на три точки, каждый из которых имеет вектор 3d float (xyz). Расчеты я использую являются:
diffverts = numpy.zeros(( ntris*3, ntesttris*3, 3), dtype = 'float32')
diffverts += triverts.reshape(ntris*3, 1, 3)
diffverts -= ttriverts.reshape(1, ntesttris*3, 3)
vertdist = (diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2) ** 0.5
этот расчет быстрее:
diffverts = triverts.reshape(ntris*3, 1, 3) - ttriverts.reshape(1, ntesttris*3, 3)
vertdist = (diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2) ** 0.5
Есть ли более быстрый способ для заполнения дифференциала верт часть (которая занимает самый длинный) и/или расстояние часть который также занимает много времени? Этот код называется много раз из-за количества тестируемых групп. Кроме того, попытка сделать это только по индексам в verts вызывает другие проблемы с дальнейшими вычислениями при попытке вернуться к некоторым логическим тестам (т. Е. Это только один из множества вычислений, поэтому лучше всего работать на уровне трех точек.
Я использую NumPy и питона
Я не знаю о слишком большом количестве, но если вам нужны только относительные расстояния, оставьте квадратный корень. Квадратный корень - довольно медленная операция в целом. Кроме того, я не уверен, как он оптимизирует это, но иногда «pow (n, 2)» виды вещей медленнее, чем «n * n». – Hans
Привет, Ханс, да, я могу уйти от squareroot, хотя мне нужно применить расстояние в форме soem к моим результатам позже. Тем не менее, я не думаю, что это очень помогает скорости (относительно). В этом примере через базовый набор петель, которые я просматриваю (т. Е. Со всеми группами), настройка части diff verts составляет около 60-70% времени v, когда фактическая дистанционная часть составляет около 30-40% – user1942439
С какими размерами вы работаете? – Hans