Re: MatrixTemplate (was SpecialMatrix)
- To: mathgroup at smc.vnet.net
- Subject: [mg28457] Re: [mg28414] MatrixTemplate (was SpecialMatrix)
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Thu, 19 Apr 2001 03:26:50 -0400 (EDT)
- References: <933FF20B19D8D411A3AB0006295069B028696B@dassne02.darmstadt.dsh.de>
- Sender: owner-wri-mathgroup at wolfram.com
Carl, Hartmut, It looks as if Packed Arrays are causing some of the features noted by Helmut. Incidentally the output from CreateMatrix seems to be the normal matrix (not packed). I have (again!) changed notation. Template1[x_, dims_]:= Fold[PadRight[{},#2,{#1}]&, x, Reverse[dims]] Template2[x_, dims_]:= Fold[Table[Evaluate[#1],{#2}]&, x, Reverse[dims]] p = 250;q= 100;r=100; Template1 gives an ordinary tensor. r1=Template1[1.1,{p,q,r}];//Timing Developer`PackedArrayQ[r1] {0. Second,Null} False Template2 give a packed array and is much slower. r2=Template2[1.1,{p,q,r}];//Timing Developer`PackedArrayQ[r2] {3.74 Second,Null} True Make a packed form of r1 and an unpacked form of r2 r1pkd= Developer`ToPackedArray[r1];//Timing r2unpkd= Developer`FromPackedArray[r2];//Timing {2.25 Second,Null} {12.47 Second,Null} The longer time for making r2 seems to be because of making the packed form. But, if we want a packed array it looks as if packing r1 to get r1pkd is the quickest way. It seems that comparing packed with unpacked forms takes more time; though not as much as if both sides were being made of the same type: comparing packed forms seems to be the quickest. r1===r2//Timing r1pkd ===r2//Timing r1 === r2unpkd//Timing r1pkd===r2unpkd//Timing {5.38 Second,True} {1.6 Second,True} {8.29 Second,True} {4.23 Second,True} If we reduce p to 249 then we Template2 no longer gives a packed array, and the timings are comparable p = 249;q= 100;r=100; r1=Template1[1.1,{p,q,r}];//Timing Developer`PackedArrayQ[r1] {0. Second,Null} False r2=Template2[1.1,{p,q,r}];//Timing Developer`PackedArrayQ[r2] {0. Second,Null} False Packing will not occur with symbolic entries: for these Template1 only shows up quicker for large tensors. p = 500;q= 500;r=500; Template1[xx,{p,q,r}];//Timing Developer`PackedArrayQ[r1] {0.11 Second,Null} False Template2[xx,{p,q,r}];//Timing Developer`PackedArrayQ[r2] {0.71 Second,Null} False 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 ----- Original Message ----- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.de> To: mathgroup at smc.vnet.net <carlw at u.washington.edu> Subject: [mg28457] RE: [mg28414] MatrixTemplate (was SpecialMatrix) > Dear Allan, dear Carl, > > these are most miraculous discoveries you both made. > The Question arises, what makes CreateMatrix such fast? > and what did you really get? a fully laid-out matrix? > This is not so, I believe. For my investigation > please see below... > > > -----Original Message----- > > From: Allan Hayes [mailto:hay at haystack.demon.co.uk] To: mathgroup at smc.vnet.net > > Sent: Tuesday, April 17, 2001 5:54 AM > > To: mathgroup at smc.vnet.net > > Subject: [mg28457] [mg28414] MatrixTemplate (was SpecialMatrix) > > > > > > The problem of creating a matrix with all the entries the > > same, say all > > zero, has cropped up in recent postings. > > The following seems to be very quick way of doing this: > > > > Clear["`*"] > > CreateMatrix[x_,m_,n_]:= > > PadRight[{#},m,{#}]&[PadRight[{x},{n},{x}]] > > > > Check > > > > CreateMatrix[0,3,5] > > > > {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}} > > > > Timings > > > > CreateMatrix[0,5000,5000];//Timing > > CreateMatrix[0,5000,2500];//Timing > > CreateMatrix[0,2500,5000];//Timing > > CreateMatrix[0,5000,250];//Timing > > CreateMatrix[0,250,5000];//Timing > > > > {0. Second,Null} > > > > {0.11 Second,Null} > > > > {0. Second,Null} > > > > {0.06 Second,Null} > > > > {0.16 Second,Null} > > > > For comparison: > > > > IdentityMatrix[5000];//Timing > > > > {10.27 Second,Null} > > > > and. using Table, > > > > Clear["`*"] > > CreateMatrix[x_,m_,n_]:= > > Table[Evaluate[Table[x,{n}]],{m}] > > > > CreateMatrix[0,3,5] > > > > {{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}} > > > > CreateMatrix[0,5000,5000];//Timing > > CreateMatrix[0,5000,2500];//Timing > > CreateMatrix[0,2500,5000];//Timing > > CreateMatrix[0,5000,250];//Timing > > CreateMatrix[0,250,5000];//Timing > > > > {10.22 Second,Null} > > > > {5. Second,Null} > > > > {4.67 Second,Null} > > > > {0.44 Second,Null} > > > > {0.55 Second,Null} > > > > -- > > 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 > > > > > > > > > [Hartmut Wolf] > > In[1]:= $Version > Out[1]= "4.0 for Microsoft Windows (April 21, 1999)" > In[2]:= mem0 = MemoryInUse[] > Out[2]= 1129872 > In[3]:= k0 = 80554 K ; > > ...this is the memory used as read off Microsoft Task Manager > at my computer (Windows 2000). > > Now we go through a sequence of steps, which are obvious: > > In[4]:= > m1 = PadRight[{#}, 2000, {#}] &@PadRight[{}, 3000, 0]; // Timing > Out[4]= {0.01 Second, Null} > In[5]:= mem1 = MemoryInUse[] > Out[5]= 1158200 > In[6]:= k1 = 80532 K; > > In[7]:= > m2 = PadRight[{{}}, {2000, 3000}, 0]; // Timing > Out[7]= {1.752 Second, Null} > In[8]:= mem2 = MemoryInUse[] > Out[8]= 25217776 > In[9]:= k2 = 104100 K; > > In[10]:= > m3 = Table[0, {2000}, {3000}]; // Timing > Out[10]= {2.965 Second, Null} > In[11]:= mem3 = MemoryInUse[] > Out[11]= 49221952 > In[12]:= k3 = 127560 K; > > > ...just for comparison, a Matrix of same size: > > In[13]:= > m4 = Partition[Range[2000*3000], 3000]; // Timing > Out[13]= {0.17 Second, Null} > In[14]:= mem4 = MemoryInUse[] > Out[14]= 73225392 > In[15]:= k4 = 151024 K; > > Now let's look at the memory used (per element): > > In[16]:= > Subtract @@@ Partition[{mem4, mem3, mem2, mem1, mem0}, 2, 1]/(2000.*3000.) > Out[16]= > {4.00057, 4.0007, 4.00993, 0.00472133} > > We see m2, m3, m4 use up four bytes/element each, which is what we > expect. However m1 is much more compact! > > In[17]:= > Subtract @@@ Partition[{k4, k3, k2, k1, k0}, 2, 1] > Out[17]= > {23464 K, 23460 K, 23568 K, -22 K} > > This is memory consumption as read off the MS TaskManager. > This is roughly consistent with recorded MemoryInUse. > > In[18]:= MemoryInUse[] > Out[18]= 73231408 > In[19]:= kk0 = 151412 K; > > Now we work with our "objects" > > In[20]:= m3 == m4 // Timing > Out[20]= {0. Second, False} > > It takes no time, to find out the discrepancy, ok. > > In[21]:= MemoryInUse[] > Out[21]= 73234112 > In[22]:= kk1 = 151424 K; > > ...and the comparison takes no memory, ok. > However... > > In[23]:= m1 == m4 // Timing > Out[23]= {4.797 Second, False} > > ... the comparison with m1 takes up more time, than was > gained in first place! Not ok! > > In[24]:= MemoryInUse[] > Out[24]= 73236368 > In[25]:= kk2 = 275144 K; > > ...what happend here? Mathematica doesn't show additional > memory used, however much had been reclaimed from the OS! > > In[26]:= m2 == m4 // Timing > Out[26]= {8.372 Second, False} > In[27]:= MemoryInUse[] > Out[27]= 73238624 > In[28]:= kk3 = 275144 K; > > ..also much time for m2 needed! > > In[29]:= m1 == m2 // Timing > Out[29]= {0.521 Second, True} > In[30]:= MemoryInUse[] > Out[30]= 73240896 > > ...this is fast > > In[31]:= kk4 = 275144 K; > In[32]:= m2 == m3 // Timing > Out[32]= {5.217 Second, True} > In[33]:= MemoryInUse[] > Out[33]= 73243144 > > In[34]:= kk5 = 275544 K; > In[35]:= m1 == m3 // Timing > Out[35]= {4.887 Second, True} > In[36]:= MemoryInUse[] > Out[36]= 73245496 > In[37]:= kk6 = 275168 K; > > I admit that these last timings are not fully conclusive, > and might be somewhat dependend on the structure of the hardware > used (This is a notebook computer from my company: > hp OmniBook 4150, and possibly there is a performance > step down at 128 MB due to chip set, furthermore there > could be some influence of paging for the last operations > (paging times are not recorded by Timing[] though), > my real memory was 192 MB). > > I will refrain from fantasizing about what is going on, > whowever someone familiar with "Mathematica inside" > is asked to comment. Esp. to the question: what must be > paid for "rapid matrix creation", and when? > > Kind regards, Hartmut >