Re: Can I do this faster?
- To: mathgroup at smc.vnet.net
- Subject: [mg103007] Re: [mg102962] Can I do this faster?
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Thu, 3 Sep 2009 19:55:51 -0400 (EDT)
- References: <200909030939.FAA20853@smc.vnet.net>
Andreas wrote:
> I start with two 2 dimensional lists. The have equal depths, but may
> or may not have equal lengths. Possible data looks like this:
>
> list1 = RandomReal[{0, 1}, {1500, 3}];
> list2 = RandomReal[ExponentialDistribution[2], {1000, 3}];
>
> The following produces the results I need, but takes longer to run
> than I'd like:
>
> Rest[FoldList[Times, 1, Transpose[(t = #; 1 + Inner[Times, t, # - 1,
> Plus] & /@ list1) & /@
> list2]]]
>
> Any suggestions rewriting this so I can make it run faster?
>
> Thanks.
Could do:
Rest[FoldList[Times, 1, (list1-1).Transpose[(list2)]+1]]
One bottleneck is that you will run into software arithmetic because
numbers become too small for machine double representation. If you don't
mind having them clipped, I think the code below might do what you want.
foldTimesC = Compile[{{mat,_Real,2}}, Module[
{current=ConstantArray[1.,Length[mat[[1]]]]},
Table[current = current*mat[[j]], {j,Length[mat]}]]]
foldTimesC[(list1-1).Transpose[(list2)]+1];
Daniel Lichtblau
Wolfram Research
- References:
- Can I do this faster?
- From: Andreas <aagas@ix.netcom.com>
- Can I do this faster?