Re: New User - Programming
- To: mathgroup at smc.vnet.net
- Subject: [mg52539] Re: [mg52507] New User - Programming
- From: yehuda ben-shimol <benshimo at bgu.ac.il>
- Date: Wed, 1 Dec 2004 05:58:07 -0500 (EST)
- References: <200411301024.FAA01340@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Excellent example for MapThread or Thread :) Your data is a = {5, 6, 3, 2, 8, 2}; b = {5, 4, 1, 3, 9, 4}; your function should be f[x_, y_] := Which[x > y, 1, x < y, -1, True, 0] and use MapThread in the following way MapThread[f, {a, b}] to get the result {0, 1, 1, -1, -1, -1} If you prefer the "pure functions" notation you may do it as MapThread[Which[#1 > #2, 1, #1 < #2, -1, True, 0] &, {a, b}] and get the same output. With Thread you may do it as the following Release[Thread[Hold[f][a, b]]] to get the same result. In general, for long vectors the Transpose is less recommended. yehuda Dean Williams wrote: >I am a new user who is well and truly stuck. Any help would be greatly >appreciated. > >I have two lists, a and b, that when compared, will produce a third >list of signals. This third list is then summed to get a cumulative >total of the signals. > >The rules are fairly simple. If a = b, the signal is 0, if a > b, the >signal is 1 and finally, if a < b, then the signal is -1. > > >a={5,6,3,2,8,2}; >b={5,4,1,3,9,4}; >c={a,b}; > >p=0; > >Fun[t_,u_]/;t==u :=0; >Fun[t_,u_]/;t>u:=1; >Fun[t_,u_]/;t<u:=-1; > >signal=Map[ (Fun[#[[1]],#[[2]]])&,Transpose[c]]; > >c4={signal}; > >cumTotal=Flatten[Map[p+={Last[#]} &,Transpose[c4]]]; > > >TableForm[{a,b,signal,total},TableDirections->Row, > TableHeadings->{{"a","b","Signal","Cumm.Total"},None}, > TableSpacing->{4,4,4,4,4}] > > >a b Signal Cum.Total > >5 5 0 0 > >6 4 1 1 > >3 1 1 2 > >2 3 -1 1 > >8 9 -1 0 > >2 4 -1 -1 > > > > >I want to modify slightly how the signal is generated. The rules are >the same except that if the cumulative total is already 1 or -1, then >no new signal is generated unless the new signal would make the >cumulative total move back towards zero. > >Ideally, I am looking to modify my code, so it produces, signal = >{0,1,0,-1,-1,0} and cumTotal = {0,1,1,0,-1,-1}.The maximum size of the >cumulative total need not be 1, but rather any value that is chosen as >a limit. > >This has been causing me a great deal of grief and I would greatly >welcome any help and suggestions. Given my lack of experience, I am >sure that there is a more efficient way to tackle this type of >problem, especially as I am dealing with many large lists. > >Regards > >Dean Williams > > >