[Scilab-users] {EXT} need a more efficient and faster code: suggestions welcome

Heinz Nabielek heinznabielek at me.com
Sat Feb 3 17:06:27 CET 2018


SORRY: n.(n-1)/2 but stll n^2

Sent from Heinz Nabielek

> On 03 Feb 2018, at 15:57, Heinz <heinznabielek at me.com> wrote:
> 
> Nearest neighbour search of n points requires n.(n+1)/2 comparisons,
> therefore execution times proportional to n^2.
> Heinz
> 
> Same as number of matches between n soccer teams........
> 
> -----Original Message-----
> From: users [mailto:users-bounces at lists.scilab.org] On Behalf Of Rafael
> Guerra
> Sent: 03 February 2018 12:42
> To: users at lists.scilab.org
> Subject: Re: [Scilab-users] {EXT} need a more efficient and faster code:
> suggestions welcome
> 
> Hello,
> 
> Heinz's interesting problem allows testing the Scilab limits and to learn
> more about Scilab code optimization for very large datasets.
> In the figure here below the execution times are plotted for the efficient
> single loop code provided by Wozai and the modified vectorized code provided
> further below.
> <http://mailinglists.scilab.org/file/t495698/NN_problem_loop_and_vectorized.
> png> 
> 
> The execution times seem to increase with N^2 or worse... which does not
> look very good. Maybe faster algorithms exist but lower level languages seem
> definitely required for very large number of points. Thanks Stephane for the
> example in C.
> 
> Scilab 6.0.0 complains about arrays with more than 2147483647 elements and
> memory allocation problems are observed in Win7 32GB laptop when doing
> computations with smaller matrices, far from that limit. A dummy example:
> --> n=4e4; A = ones(n,1)*ones(1,n) + ones(n,1)*ones(1,n);
>    Can not allocate 12800.00 MB memory.
> However, >21GB of RAM are available.
> Are these matrix size constraints going to be lifted in future Scilab 6
> releases?
> 
> 
> // START OF CODE (Scilab 6)
> clear;
> n= 30000;
> 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]; Xs = sum(X.*X,'c'); XX =
> Xs.*.ones(n,1)' + ones(n,1).*.Xs';  // faster than using transpose XX = XX -
> 2*X*X';
> XX(1:n+1:$) = %nan;  // remove diagonal 0's
> MinDist1 = min(XX,'r').^0.5;   //min taken along rows is faster
> clear  Xs  XX;
> //END OF CODE
> 
> Thanks and regards,
> Rafael
> 
> 
> 
> 
> --
> Sent from:
> http://mailinglists.scilab.org/Scilab-users-Mailing-Lists-Archives-f2602246.
> html
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users
> 



More information about the users mailing list