Re: Finding Maxima in tensors
- To: mathgroup at smc.vnet.net
- Subject: [mg34654] Re: [mg34625] Finding Maxima in tensors
- From: Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp>
- Date: Fri, 31 May 2002 04:26:33 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
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 > > >