Re: Fast alternative to Nest[.] or NestList[.]? (version 6.0)
- To: mathgroup at smc.vnet.net
- Subject: [mg81900] Re: [mg81874] Fast alternative to Nest[.] or NestList[.]? (version 6.0)
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Sat, 6 Oct 2007 04:38:18 -0400 (EDT)
- References: <9545769.1191601521352.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
No, you can't make Nest any faster, but my "iter" function (below) is 6 or
7 times faster than "iterate".
(The other changes are for style and shouldn't matter.)
(*this is input which is required for the simulation*)
div = RandomInteger[{10}, {10, 10}];
inv = 2;
{zus, wert} = Dimensions@div;
periods = 500;
(*some precalculations*)
reldiv = div/(Total /@ div);
gop = Mean@reldiv;
lambda = Transpose@{gop, ConstantArray[1/wert, wert]};
h = 81;
g = 81;
rho[h_, g_] = {{h/200, 0}, {0, g/200}};
verm = {a, b};
theta[a_, b_] =
Simplify@Transpose[#/Total /@ #] &[
Diagonal[rho[h, g]]*verm*# & /@ lambda];
preCalc[a_, b_] =
Inverse[IdentityMatrix[inv] - theta[a, b].lambda.rho[h, g]].theta[a,
b] // Simplify;
Clear[iter, a, b]
iter[i_Integer] := preCalc[a, b].div[[i]] // Simplify
iter[a_, b_, i_Integer] := iter[a, b, i] = iter[i]
Timing[Table[iter[a, b, i], {i, 1, zus}];]
iter[{aa_, bb_}] :=
N[iter[a, b, Ceiling[zus*RandomReal[]]] /. {a -> aa, b -> bb}]
{0.031, Null}
(The Table above MUST be precalculated, even though it's never used.)
Timing[Nest[iter, {5, 5}, periods]]
{0.094, {70.3256, 10.3466}}
Bobby
On Fri, 05 Oct 2007 03:56:24 -0500, kristoph <kristophs.post at web.de> wro=
te:
> Dear all,
>
> I have a timing issue considering the listing below. I'm applying a
> Nest function to simulate some data. So far it takes about 0.5 seconds=
> for each simulation.I was wondering if there is a very fast
> alternative to the build-in function Nest or NestList.
>
> I would be very grateful for any comments or insights regarding
> cutting running time.
> Please do not be deterred from the program most of the parameters are
> just inputs for the simulation. At the end there is
> Timing[Nest[iterate, {5, 5}, periods]] which I need much faster than
> it is already.
>
> Thank you very much in advance,
> Kristoph
>
> (* this is input which is required for the simulation*)
> div=Table[RandomInteger[{10}],{i,1,10},{j,1,10}];
> inv=2;
> zus=Length[div];
> wert=Dimensions[div][[2]];
> periods = 500;
>
> (*some precalculations*)
> reldiv = Table[div[[i, k]]/Total[div[[i]]], {i, 1, Length[div]}, {k,=
> 1, wert}];
> gop = Table[Mean[reldiv[[All, i]]], {i, 1, wert}];
> eq = Table[1/wert, {i, 1, wert}];
> lambda = Transpose[{gop, eq}];
> h = 81;
> g = 81;
> rho[h_, g_] := {{h/200, 0}, {0, g/200}};
> verm = {a, b};
> theta[a_, b_] =Simplify[Table[(lambda[[k, i]]*rho[h, g][[i,
> i]]*verm[[i]])/Sum[lambda[[k, j]]*rho[h, g][[j, j]]*verm[[j]] , {j, 1,=
> inv}], {i, 1, inv}, {k, 1, wert}] ];
>
> preCalc[a_, b_] =
> Inverse[IdentityMatrix[inv] - theta[a, b].lambda.rho[h, g]].theta[a,=
> b] // Simplify;
> iterate[{a_, b_}] :=
> N[preCalc[a, b].div[[Ceiling[zus*RandomReal[]]]]];
> relverm[a_, b_] := (rho[h, g][[1, 1]] a)/Total[rho[h, g].{a, b}];
>
> (*this I need to be fast*)
> Timing[Nest[iterate, {5, 5}, periods]]
>
>
>
-- =
DrMajorBob at bigfoot.com