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