[Date Index]
[Thread Index]
[Author Index]
Re: Particular structure
*To*: mathgroup at smc.vnet.net
*Subject*: [mg33656] Re: Particular structure
*From*: "Allan Hayes" <hay at haystack.demon.co.uk>
*Date*: Thu, 4 Apr 2002 19:40:41 -0500 (EST)
*References*: <a8g36d$b2s$1@smc.vnet.net>
*Sender*: owner-wri-mathgroup at wolfram.com
Yas,
Here is a solution, simpler than the one one I posted Re: Particular
structure[2] and that you report below.
It seems to hold out more hop of generalizing.
Quit
x= y=Table[1,{400}];f=Plus;F= Times;
Table[ReleaseHold[F@@#],{j, Length[y]}]&[
Table[f[x[[i]],Hold[y[[j]]],z],{i,Length[x]}]];//Timing
{7.41 Second,Null}
MaxMemoryUsed[ ]
1451568
As you note, the problem with using Outer is that a very large matrix is
constructed, using lots of memory, before the function F is used. The method
above, and my previous one, uses the fact that Table evaluates step by step,
building up a list of *values* of F[...], these may use much less memory
than the expressions F[...]. Of course if the values of F[...] were bigger
than the expression then nothing would be gained.
I have used Table for generating {f[..],f[...] ....} in case there is some
benefit here also, and for uniformity. We could use f[...]&/@x as in my
previous code.
Incidentally, the use of Hold[ y[[i]] ] , and the subequent release with
ReleaseHold is to prevent Mathematica reacting to y[[i]] with a symbolic
input i, it generates messages and this slows down the evaluation
considerable - even if we turn the messages off.
GENERAL PRINCIPLE: avoid messages if possible - even if you turn them off
they slow down evaluation.
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Yas" <yast at optushome.com.au> wrote in message
news:a8g36d$b2s$1 at smc.vnet.net...
> Hi,
> Thanks to all the replies to the problem I posted earlier on achieving a
> particular structure. All the solutions provided deal with the problem
> adequately but because my lists are fairly large I find myself running
> out of memory. For example, using Outer on lists where x > 500 and y >
> 100 gets me into trouble very quickly. The other draw back is that the
> time for calculation gets long.
>
> In an effort to overcome these undesirable properties, Allan Hayes has
> suggested the following construct,
>
> x = y = Table[i + 1, {i, 1, 400}]; f = Plus; F = Times @@ # &;
>
> Table[Function[kk, ReleaseHold[#]][y[[i]]], {i, Length[y]}] &[
> Hold[F][f[#, kk, z] & /@ x]]; // Timing
>
> {5.81667 Second, Null}
>
> This construct is more efficient than the ones I've constructed
> previously in that the MaxMemoryUsed is reduced by a whopping 93% and
> the time for evaluation reduced by half compared to those using Outer
> and Map[Map...
>
> I wonder if there are any other suggestions to speeding things up even
> more?
>
> Cheers
> Yas
>
>
Prev by Date:
**Re: problems with ContourPlot**
Next by Date:
**Re: problems with ContourPlot**
Previous by thread:
**Re: Particular structure**
Next by thread:
**LiveGraphics 3D, Browsers and MacOS X**
| |