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,
>     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

```

• Prev by Date: 4th subharmoic functions
• Next by Date: Re: Re: Proving inequalities with Mathematica
• Previous by thread: Re: New User - Programming
• Next by thread: Re: New User - Programming