Re: Apply function to parts of a list
- To: mathgroup at smc.vnet.net
- Subject: [mg86377] Re: Apply function to parts of a list
- From: Albert Retey <awnl at arcor.net>
- Date: Sun, 9 Mar 2008 05:07:57 -0500 (EST)
- References: <fqo8pn$svq$1@smc.vnet.net> <fqqs3l$kfp$1@smc.vnet.net> <fqtqog$da4$1@smc.vnet.net>
=C2=B4Hi, > More generally now : Again I have a list of list but with more > "dimensions" Something like that : > > data={{x1,y1,z1,f1,g1,h1},{x2,y2,z2,f2,g2,h2},{x3,y3,z3,f3,g3,h3},...= > {xn,yn,zn,fn,gn,hn}} > > And let's say I wanna, for the sake of the example, add 10 to all the > y's i.e. I want > > {{x1,y1+10,z1,f1,g1,h1},{x2,y2+10,z2,f2,g2,h2},{x3,y3+10,z3,f3,g3,h3},.= =2E. > {xn,yn+10,zn,fn,gn,hn}} > > According to all your suggestions, I could do > > {#1,#2+10,#3,#4,#5,#6}& @@@ data > > Right ? Isn't there another simpler way (imagine instead of 6 elements > (x,y,z,f,g,h), I have 100 !) > I think for this the transpose variation already suggested will not only = be easiest to understand and read but probably also the most efficient for large matrices. This is how I would do it: create data and check that it has the dimensions you intended: data=RandomReal[{0,1},{12,100}]; Transpose[data]//Dimensions create a list of numbers to add to each row, here we need all zeros except for the second entry. Of course there are numerous ways to construct such a list, but I think this is efficient and easy to read (for efficientcy you might want to use machine precision numbers): addends=Table[0,{100}]; addends[[2]]=10; now use the already known approach with transposing twice (note that you = could use every function that is listable instead of only Times and Plus)= : res=Transpose[addends+Transpose[data]]; check that it did what you wanted: res[[All,1;;3]]//MatrixForm hth, albert