Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: help to make code run faster (mathematica v8.01)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg121386] Re: help to make code run faster (mathematica v8.01)
  • From: kristoph <kristophs.post at web.de>
  • Date: Tue, 13 Sep 2011 07:20:09 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201109101128.HAA02485@smc.vnet.net> <j4i6b6$c0d$1@smc.vnet.net>

On 11 Sep., 13:33, DrMajorBob <btre... at austin.rr.com> wrote:
> You should make this change just for sanity:
>
> tStat[data_, band_, residuals_] :=
>   ParallelSum[
>    val1[residuals[[k]], residuals[[j]], data[[k]], data[[j]],
>     band], {k, 1, -1 + Length@data}, {j, k + 1, Length@data}]
> tStat[reg, h, fit["FitResiduals"]] // AbsoluteTiming
>
> and this for simplicity/transparency:
>
> des = Thread[{1., reg}];
>
> For speed, try this:
>
> n = 250;
> resp = RandomReal[10, n];
> reg = RandomReal[1, n];
> des = Thread[{1., reg}];
> fit = LinearModelFit[{des, resp}];
> h = 1.06  n^(-1/5) StandardDeviation@reg;
> epanKern = Compile[{u}, If[Abs[u] < 1, 3/4 (1 - u^2), 0]];
> Timing[
>   res = fit["FitResiduals"];
>   t1 = Flatten[Table[res[[k]] res[[j]], {k, 1, n - 1}, {j, k + 1, n}]=
,
>     1];
>   t2 = Map[epanKern,
>     Flatten[Table[reg[[k]] - reg[[j]], {k, 1, n - 1}, {j, k + 1, n}],
>       1]/h];
>   t1.t2]
>
> {0.139224, -379.538}
>
> or
>
> epanKern = Compile[{u}, Max[u, 0]];
> Timing[
>   res = fit["FitResiduals"];
>   t1 = Flatten[Table[res[[k]] res[[j]], {k, 1, n - 1}, {j, k + 1, n}]=
,
>     1];
>   t2 = 1 - (Flatten[
>        Table[reg[[k]] - reg[[j]], {k, 1, n - 1}, {j, k + 1, n}], =
1]/
>       h)^2;
>   3/4 t1.epanKern /@ t2]
>
> {0.124846, -379.538}
>
> or
>
> Timing[
>   res = fit["FitResiduals"];
>   t1 = Flatten[Table[res[[k]] res[[j]], {k, 1, n - 1}, {j, k + 1, n}]=
,
>     1];
>   t2 = 1 - (Flatten[
>        Table[reg[[k]] - reg[[j]], {k, 1, n - 1}, {j, k + 1, n}], =
1]/
>       h)^2;
>   t2 = Unitize[1 + Sign@t2] t2;
>   3/4 t1.t2]
>
> {0.118036, -379.538}
>
> When possible, take advantage of vectorized functions like Dot, Sign and =
 
> Unitize, rather than ParallelSum or Compile. You can get more from one =
 
> kernel than you might get from several.
>
> Bobby
>
>
>
>
>
>
>
>
>
> On Sat, 10 Sep 2011 06:28:51 -0500, kristoph <kristophs.p... at web.de> wrot=
e:
> > Hi
>
> > I'm running out of options in order to make my code run faster. I do
> > appreciate any help. I programmed a function named tStat that
> > basically sums over two compiled functions. Although, I run the
> > function parallel it is still rather slow. Thanks in advance for help.
> > Here is what I mean:
>
> > (*the following 5 lines is just random input data to test the
> > function*)
>
> > resp=RandomReal[10,250];
> > reg=RandomReal[1,250];
> > des=DesignMatrix[Table[{reg[[i]],resp[[i]]},{i,1,Length[reg]}],x,x];
> > fit=LinearModelFit[{des,resp}];
> > h=1.06 StandardDeviation[reg] Length[reg]^(-1/5);
>
> > (*the two compiled functions which are inputs for the function tStat*)
>
> > epanKern=Compile[{u},
> > If[Abs[u]<1,3/4 (1-u^2),0]
> > ];
>
> > val1=Compile[{{rk,_Real},{rj,_Real},{dk,_Real},{dj,_Real},
> > {band,_Real}},
> > rk rj epanKern[(dk-dj)/band]];
>
> > (*the following function is rather slow*)
>
> > tStat[data_,band_,residuals_,leg_]:=Module[{k,j,res=0,var=0},
> > res=ParallelSum[val1[residuals[[k]],residuals[[j]],data[[k]],data[[j]=
],band ],
> > {k,1,leg},{j,k+1,leg}];
> > 2 res
> > ];
>
> > (*executing the function*)
> > tStat[reg,h,fit["FitResiduals"],Length[reg]]//AbsoluteTiming
>
> --
> DrMajor... at yahoo.com

As always very nice. Thanks for your kind help.




  • Prev by Date: Re: help to make code run faster (mathematica v8.01)
  • Next by Date: Is this a bug ? 1/N[Range[3]] = crash
  • Previous by thread: Re: help to make code run faster (mathematica v8.01)
  • Next by thread: Re: help to make code run faster (mathematica v8.01)