Re: FindLast NZ in list
- To: mathgroup at smc.vnet.net
- Subject: [mg46218] Re: FindLast NZ in list
- From: "Ted Ersek" <ersekjm at tqci.net>
- Date: Thu, 12 Feb 2004 07:15:45 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
I haven't yet answered this one. First I make a list of data.
len=1000000;
data=Table[0,{len}];
Do[
Part[data,Random[Integer,{1,len}]] = Random[],
{Floor[len/100]}
];
-----------------------
This quickly finds the last non-zero element.
Select[Reverse[data],#=!=0&,1] //Timing
{0.125 Second,{0.447473}}
-------------------------
This quickly finds the position of the last non-zero element.
1+Length[data]-Position[Reverse[data],_?(#=!=0&),1,1,Heads->False] //Timing
{0.109 Second,{{999854}}}
-------------------------
Note: (#=!=0&) is faster than (# != 0&) but they are not the same.
0.0 =!= 0 returns True.
0.0 != 0 returns False.
This should be faster when (data) is a packed array, but I wasn't able
to demonstrate that. In this case we should have a packed array when all
parts of the list are machine numbers with the same head.
----------------------------
Wolfram Research should have made it so we could do:
Position[data, pattn, levelspec, -1 ]
Select[data, test, -1]
I wrote a package that does that and much more. The package is posted at
http://library.wolfram.com/infocenter/MathSource/495/
While the package extends Position, Select and others vary well, it
isn't as fast as my version above. I might improve the package in the
coming weeks.
---------------------------
Regards,
Ted Ersek
Download Mathematica tips from
http://library.wolfram.com/infocenter/MathSource/4557/
or see them on a web site at
http://www.verbeia.com/mathematica/tips/Tricks.html