Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2004
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • 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