Re: Finding Maxima in tensors
- To: mathgroup at smc.vnet.net
- Subject: [mg34659] Re: [mg34625] Finding Maxima in tensors
- From: Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp>
- Date: Fri, 31 May 2002 04:26:43 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
i looked at this again and found it's easy to compile opt1, all one needs to do is to borrow the way of iterating you used in opt. So now the fastest code so far is: opt4 = Compile[{{p, _Real, 4}, {z, _Real, 2}}, Block[{a, b, d, dima, dimb, dimc, dimd}, {dima, dimb, dimc, dimd} = Dimensions[p]; Array[Max[p[[#1, #2, All, #3]] + z[[#1]]] &, {dima, dimb, dimd}]]] With the previous example it gives: In[65]:= (z4=opt4[p,z];)//Timing Out[65]= {0.35 Second,Null} That's over 5.5 times faster than your original code, although I am still pretty sure one can improve it further. On Thursday, May 30, 2002, at 09:38 PM, Andrzej Kozlowski wrote: > First I quickly constructed a version that is simpler and faster than > yours: > > opt1[p_, z_] := > Array[Max[p[[#1, #2, All, #3]] + z[[#1]]] &, Drop[Dimensions[p], {3}]] > > However, when I tired to compile it I found difficulties and gave up. > Instead I turned to your original program which compiled without > problems: > > opt3 = Compile[{{p, _Real, 4}, {z, _Real, 2}}, > Block[{a, b, d, dima, dimb, dimc, dimd}, > {dima, dimb, dimc, dimd} = Dimensions[p]; > Table[ > Max[MapThread[Plus, > {p[[a, b, All, d]], z[[a]]}]], > {a, dima}, {b, dimb}, {d, dimd}]]] > > Here is how they performed on my 400 megaherz PowerBook G4; > > p = Array[Random[] &, {20, 20, 20, 20}]; > z = Array[Random[] &, {20, 20}]; > > In[58]:= > (z1=opt[p,z];)//Timing > > Out[58]= > {1.93 Second,Null} > > In[59]:= > (z2=opt1[p,z];)//Timing > > Out[59]= > {0.58 Second,Null} > > In[60]:= > (z3=opt3[p,z];)//Timing > > Out[60]= > {0.75 Second,Null} > > In[62]:= > z1==z2==z3 > > Out[62]= > True > > So my uncompiled opt1 seems faster even than the compiled version of > your opt, opt3, even though in earlier tests for tensors of smaller > size opt3 had the advantage. I am sure it can all be very much improved > since I have spent very little time on it. In particular, I think it > should be possible to make some changes to opt1 that will allow it to > be compiled. > Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/ > > > On Thursday, May 30, 2002, at 03:55 PM, Johannes Ludsteck wrote: > >> I have a rank 4 tensor p and a matrix z. My task is >> to find the maxima of the vectors >> p[a,b,All,d] + z[[a]] >> for all a,b, and d (a,b, and d are simply indices) >> and collect them in a rank 3 tensor. >> >> Here is my implementation: >> >> opt[p_,z_]:=Block[{a,b,d,dima,dimb,dimc,dimd}, >> {dima,dimb,dimc,dimd}=Dimensions[p]; >> Table[ >> Max[MapThread[Plus, >> {p[[a,b,All,d]],z[[a]]}]], >> {a,dima},{b,dimb},{d,dimd}]] >> >> (Of course, the dimensions of p and z do match, i.e. >> Dimensions[p][[{1,3}]]==Dimensions[z].) >> >> The implemtation works but seems to be awkward. >> Since I have to apply the maximum search for tensors of >> even higher rank and opt[...] is evaluated some thousand times, >> a more concise implementation would help. >> I feel that the problem should have a shorter and simpler >> Mathematica code representation, but I cannot find it. >> >> Any suggestions? >> >> Best regards, >> Johannes Ludsteck >> >> >> >> <><><><><><><><><><><><> >> Johannes Ludsteck >> Economics Department >> University of Regensburg >> Universitaetsstrasse 31 >> 93053 Regensburg >> Phone +49/0941/943-2741 >> >> >> >