Dear friends,
problem [below] is solved, but I need a more efficient and faster code: this is
a Monte-Carlo simulation of n random points in a 3d spherical volume of radius
r. A typical case is n=20,000 and r=23 mm. And from this, I need the resulting
probability distribution of nearest neighbours.
First attempt with doubly nested for-loops took 6 hours execution time. Version
below with more vecctor operations is down to 6 minutes, but suggestions for
further improvements would be welcome.
Greetings
Heinz
n=20000;
r=23;
radius = r*grand(n,1,'def').^(1/3);
phi = 2*%pi*grand(n,1, 'def');
costheta = 1 - 2*grand(n,1, 'def');
radsintheta = radius.*sin(acos(costheta));
X = [radsintheta.*cos(phi),radsintheta.*sin(phi), radius.*costheta];
ONE=(ones(1:n-1))';
MinDist=[];
for i=1:n;
this=X(i,:);XX=X;XX(i,:)=[];
DIFF=XX-ONE*this;
MinDist=[MinDist sqrt(min(sum(DIFF.^2,2)))];
end;
jj=-0.05:0.1:3.05;nj=length(jj);
[0.05+jj(1:nj-1)' (histc(jj,MinDist))']
RESULTING OUTPUT
DIST. PROBABILITY
[mm]
0. 0.0003
0.1 0.0044
0.2 0.0202
0.3 0.0417
0.4 0.06735
0.5 0.0984
0.6 0.12555
0.7 0.13335
0.8 0.1357
0.9 0.1155
1. 0.09735
1.1 0.0684
1.2 0.0438
1.3 0.02495
1.4 0.01385
1.5 0.00535
1.6 0.0023
1.7 0.00095
1.8 0.0005
1.9 0.00005
2. 0.00005
2.1 0.
... ...._______________________________________________
users mailing list
[email protected]
http://lists.scilab.org/mailman/listinfo/users