MathGroup Archive 2004

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

Search the Archive

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


  • Prev by Date: Re: Re: Changing CellMargins?
  • Next by Date: Re: launching a kernel on a remote linux machine through ssh from a linux machine
  • Previous by thread: Re: New User - Programming
  • Next by thread: Re: New User - Programming