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!

Antworten (2)

Matt J
Matt J am 29 Jul. 2013

0 Stimmen

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

2 Kommentare

Matt J
Matt J am 30 Jul. 2013
Bearbeitet: Matt J am 30 Jul. 2013
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.

Melden Sie sich an, um zu kommentieren.

Richard Brown
Richard Brown am 29 Jul. 2013
Bearbeitet: Richard Brown am 29 Jul. 2013
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?

Tags

Gefragt:

am 29 Jul. 2013

Community Treasure Hunt

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

Start Hunting!

Translated by