FW: comparing two lists

*To*: mathgroup at smc.vnet.net*Subject*: [mg54363] FW: [mg54284] comparing two lists*From*: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>*Date*: Sat, 19 Feb 2005 02:32:10 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

-----Original Message----- From: Wolf, Hartmut To: mathgroup at smc.vnet.net Subject: [mg54363] Re: [mg54284] comparing two lists >-----Original Message----- >From: Curt Fischer [mailto:tentrillion at gmail.NOSPAM.com] To: mathgroup at smc.vnet.net >Sent: Wednesday, February 16, 2005 8:36 PM >To: mathgroup at smc.vnet.net >Subject: [mg54363] [mg54284] comparing two lists > >Dear Group: > >I want to write a function that accepts a n-vector and an n x >m matrix. >It should return a list of positions in the matrix where >mat[[i,j]] > vec[[i]]. For example, > >In[287]:= >vec=Table[Random[],{2}] > >Out[287]= >{0.482259,0.314393} > >In[288]:= >mat=Table[Table[Random[],{4}],{2}] > >Out[288]= >{{0.183706,0.758693,0.462242,0.170041},{0.457054,0.349658,0.805 >455,0.127763}} > >I would like myFunc[] to return {{2},{1,2,3}}. > >How could I write this as a pure function? Ideally I would >like to be able to Map or Apply my function to the list {mat, >vec} and get my result. > >Something like > >Position[#1,_?(#>#2&)]&@@{mat,vec} > >is doomed to fail because the PatternTest required in >Position[] messes up the slotting of the other arguments. > >Ideas? How do you nest pure functions? > >-- >Curt Fischer > > Curt, you can easily avoid the problems of entangled function definitions by resorting to Condition and named pattern: In[3]:= MapThread[Flatten@Position[#1, x_ /; x > #2] &, {mat, vec}] Out[3]= {{2}, {1, 2, 3}} For your question of nesting: at least one function definition must be made by supplying explicit argument names to Function. You can do that one way or the other: In[4]:= MapThread[Function[{m, v}, Flatten[Position[m, _?(# > v &)]]], {mat, vec}] Out[4]= {{2}, {1, 2, 3}} or In[5]:= MapThread[Flatten[Position[#1, _?(Function[x, x > #2])]] &, {mat, vec}] Out[5]= {{2}, {1, 2, 3}} The parentheses around Function[x,..] are neccessary because ? (PatternTest) has such a strong precedence. To your original problem, you might consider: In[6]:= Position[mat - vec, _?Positive, {2}] Out[6]= {{1, 2}, {2, 1}, {2, 2}, {2, 3}} which is not quite of the form specified, but perhaps better. You might convert one form to the other, e.g In[7]:= Split[%, First[#1] === First[#2] &][[All, All, 2]] Out[7]= {{2}, {1, 2, 3}} In[8]:= Flatten[MapIndexed[Outer[List, #2, #1] &, %], 2] Out[8]= {{1, 2}, {2, 1}, {2, 2}, {2, 3}} -- Hartmut Wolf