Re: New User - Programming
- To: mathgroup at smc.vnet.net
- Subject: [mg52536] Re: New User - Programming
- From: Peter Pein <petsie at arcor.de>
- Date: Wed, 1 Dec 2004 05:57:57 -0500 (EST)
- References: <cohikg$1jg$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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 > Hi Dean, if I understood you well, you're looking for sth. like: In[1]:= a = {5, 6, 3, 2, 8, 2}; b = {5, 4, 1, 3, 9, 4}; c = {a, b}; (* this is your old version: *) Sign[Subtract @@ #] & /@ Transpose[c] Out[4]= {0, 1, 1, -1, -1, -1} Rest@FoldList[Plus, 0, %] Out[5]= {0, 1, 2, 1, 0, -1} In[6]:= newsignal[l1_, l2_] := Module[{tr = Transpose[{l1, l2}], cum = 0, ct = {}, s, ns}, {( s = Sign[Subtract @@ #]; ns = If[cum == 0 || cum + s == 0, s, 0]; ct = {ct, cum += ns}; ns ) & /@ tr, Flatten[ct]}] In[7]:= {signal, total} = newsignal[a, b]; In[8]:= TableForm[{a, b, signal, total}, TableDirections -> Row, TableHeadings -> {{"a", "b", "Signal", "Cumm.Total"}, None}, TableSpacing -> {4, 4, 4, 4}, TableAlignments -> Right] a b Signal Cumm.Total 5 5 0 0 6 4 1 1 3 1 0 1 2 3 -1 0 8 9 -1 -1 2 4 0 -1 -- Peter Pein 10245 Berlin