Фортран рассчитывает расстояние от многих точек до фиксированной точки

Есть ли более элегантный и лаконичный способ вычисления расстояний между набором точек и фиксированной точкой, чем это?

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)
Другие вопросы по тегам