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.
- References:
- help to make code run faster (mathematica v8.01)
- From: kristoph <kristophs.post@web.de>
- help to make code run faster (mathematica v8.01)