How do I efficiently calculate a scalar distance with 3d geometry?

I have a piece of code that is called many times (~5e5) during a time stepping solution. Having run profiler, the following line is slowing everything down:
r2 = sqrt((x-x2).*(x-x2)+(y-y2).*(y-y2)+(z-z2).*(z-z2));
Where x, y, z are (500, 1) and x2, y2, z2 are scalars.
Any suggestions?
Thanks!

답변 (2개)

Matt J
Matt J 2013년 7월 29일

0 개 추천

This might speed things up,
Haven't used it myself, though.

댓글 수: 2

It should also help (a little) if you don't compute x-x2 etc... twice. So in other words, you would first do
dx=x-x2;
dy=y-y2;
dz=z-z2;
and then
r2 = sqrt(dx.*dx +dy.*dy +dz.*dz);
or whatever...
DNorm2 requires matrices as input and creating [dx, dy, dz] at first wastes too much time. So if the data could be organized as [500 x 3] matrix instead of three vectors, DNorm2 would be an option.

댓글을 달려면 로그인하십시오.

Richard Brown
Richard Brown 2013년 7월 29일
편집: Richard Brown 2013년 7월 29일
You should use hypot. It also has better numerical stability.
edit sorry, you're in 3D. That obviously won't work. You can use hypot as
r = hypot((x-x2) + 1i*(y-y2), z - z2);
This may be slower than what you currently have though. If you use (x - x2).^2 instead of (x - x2) .* (x - x2) you'll probably get a small performance boost. Can you avoid calculating the square root and work with squared distance instead?

태그

질문:

2013년 7월 29일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by