Re: help to make code run faster (mathematica v8.01)
- To: mathgroup at smc.vnet.net
- Subject: [mg121340] Re: help to make code run faster (mathematica v8.01)
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sun, 11 Sep 2011 07:29:38 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201109101128.HAA02485@smc.vnet.net>
- Reply-to: drmajorbob at yahoo.com
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.post at web.de> wrote: > 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 > -- DrMajorBob at yahoo.com
- 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)