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: [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




  • Prev by Date: Re: Column vectors should be interpreted as simple lists where
  • Next by Date: Re: help to make code run faster (mathematica v8.01)
  • Previous by thread: help to make code run faster (mathematica v8.01)
  • Next by thread: Re: help to make code run faster (mathematica v8.01)