Re: Logical comparisons of items in a two lists
- To: mathgroup at smc.vnet.net
- Subject: [mg75484] Re: Logical comparisons of items in a two lists
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Wed, 2 May 2007 03:57:04 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <f16q2u$7er$1@smc.vnet.net> <f1720h$9kj$1@smc.vnet.net>
dh wrote: > Hi Larry, > > what's wrong with Count? It is pretty efficient. However, you could > > speed up the creation of the list a bit by e.g.: Thread[list1 > list2] > > or you could use Compilation: > > fun=Compile[{{v1,_Real,1},{v2,_Real,1}},Table[Boole[v1[[i]]<v2[[i]]],{i,1,Length[v1]}]]; > > Total@ fun[list1,list2] > > hope this helps, Daniel > > > > actuary at mchsi.com wrote: > >> Hello: > > >> I have two lists of real numbers, a & b. I want two compare > >> individual items in one list to the corresponding items in the other > >> list. For example Is a[[1]] > b[[1]]. At the end of the comparisons, > >> I want to count the "Trues". I know how to do this use a "Table" > >> statement and a "Count" statement. Is there a quicker, more efficient > >> way of counting the number of "Trues". I read Daniel's reply after I had sent my comparison tests. In the updated tests (see below), you will notice that Daniel's solutions are faster than mine; that is Table is slower than MapThread which is slower than Thread which is slower than the compile function using Boole and Total. In[1]:= $HistoryLength = 0; n = 7; a = Table[Random[], {10^n}]; b = Table[Random[], {10^n}]; Timing[Count[Table[a[[i]] > b[[i]], {i, 10^n}], True]] Timing[Count[MapThread[#1 > #2 & , {a, b}], True]] Timing[Count[Thread[a > b], True]] fun = Compile[{{v1, _Real, 1}, {v2, _Real, 1}}, Table[Boole[v1[[i]] > v2[[i]]], {i, 1, Length[v1]}]]; Timing[Count[fun[a, b], 1]] Timing[Total[fun[a, b]]] Out[5]= {31.391 Second,4998967} Out[6]= {19.656 Second,4998967} Out[7]= {13.766 Second,4998967} Out[9]= {9. Second,4998967} Out[10]= {7.078 Second,4998967} Cheers, Jean-Marc