Фортран рассчитывает расстояние от многих точек до фиксированной точки
Есть ли более элегантный и лаконичный способ вычисления расстояний между набором точек и фиксированной точкой, чем это?
real, dimension(3, numPoints) :: points
real, dimension(3) :: source
real, dimension(numPoints) :: r
r = sqrt((points(1,:) - source(1))**2 + &
(points(2,:) - source(2))**2 +
(points(3,:) - source(3))**2)
Я старался
r = sqrt(sum((points - source)**2,1))
но это - неудивительно - не работает.
1 ответ
Если у вас есть новейший компилятор, который реализует встроенные функции, добавленные в Fortran в ревизии 2008 года, следующее выражение может удовлетворить ваши идеи элегантности и краткости для вычисления одного расстояния:
r(1) = norm2(points(:,1)-source)
Если у вас нет новейшего компилятора, вы, вероятно, обнаружите, что в вашем компиляторе есть нестандартная функция для нормы L2, или что у вас есть библиотека, которая его реализует.
У меня нет Фортрана на этой машине, поэтому я перевожу это на одну строчку, которая вычисляет расстояния всех точек от source
Я оставляю это заинтересованному читателю. Но я бы не стал нюхать очевидное решение, которое бы проходило по всем пунктам по очереди.
РЕДАКТИРОВАТЬ: ОК, вот одна строка, не проверено
r = norm2(points-spread(source,dim=1,ncopies=numpoints),dim=2)