MathGroup Archive 2004

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

Search the Archive

Re: Find last NZ in list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg46163] Re: Find last NZ in list
  • From: carlos at colorado.edu (Carlos Felippa)
  • Date: Mon, 9 Feb 2004 05:54:11 -0500 (EST)
  • References: <200402060915.EAA19244@smc.vnet.net> <c02cp5$54m$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Many thanks for the submissions.  Here is a comparison of five
functions and their timings on a mac g4.

FindLastNonzero[a_]:=Module[{n=Length[a]},   
    For [i=n,i>0,i--, If [a[[i]]==0,Continue[],Return[i],
    Return[i]]]; Return[0]];  (* CAF *)
FindLastNonzero1[a_]:=Module[{n=Length[a]},    
    For [i=n,i>0,i--, If [a[[i]]!=0,Return[i],Continue[],
    Return[i]]]; Return[0]];  (* CAF *)
FindLastNonzero2[a_]:=Catch[Do[If[a[[i]]=!=0,Throw[i]],{i,Length[a],1,-1}];0];
        (* Andrzej Kozlowski *)
FindLastNonzero3[a_]:=First[Position[a, _?(# == 0 &)]] - 1;    (*
János Lobb *)
FindLastNonzero4[lst_]:=
  Module[{tmp=DeleteCases[lst,0]},
    If[Length[tmp]!=0,Last[tmp],0]  ];  (* Bo Le *)
FindLastNonZero5[liste_] :=
  If[Position[(StringMatchQ[#1, "0"] & ) /@
      ToString /@ liste, False] != {},
   Last[Position[(StringMatchQ[#1, "0"] & ) /@
       ToString /@ liste, False]][[1]], 0];  (* Florian Jaccard *)
      
nn=20000;  a=Table[0,{nn}]; a[[666]]=dante;  
Print[Timing[FindLastNonzero  [a]]];
Print[Timing[FindLastNonzero1[a]]];
Print[Timing[FindLastNonzero2[a]]];     
Print[Timing[FindLastNonzero3[a]]];    (* fails on this example *)
Print[Timing[FindLastNonzero4[a]]];    (* returns entry, not index *)
(* Print[Timing[FindLastNonzero5[a]]];  does not work *) 

{0.55 Second,666}
{0.4 Second,666}
{0.133333 Second,666}
{0.2 Second,{0}}
{0.0333333 Second,dante}

FindLastNonzero4 is fastest but requires another Position search for
the entry index .  Of those that work in one shot, FindLastNonzero2 is
fastest.

The most elegant functional solution would be to say
  i = FirstPosition[Reverse[a],!=0];
as a built in function.  But this doesnt exist.


  • Prev by Date: Re: How to printout more digits?
  • Next by Date: RE: Formal Definition of the Term "Form"
  • Previous by thread: Re: Find last NZ in list
  • Next by thread: Re: Re: Find last NZ in list