Re: First nonzero in list
- To: mathgroup at smc.vnet.net
- Subject: [mg110873] Re: First nonzero in list
- From: Ray Koopman <koopman at sfu.ca>
- Date: Fri, 9 Jul 2010 07:04:00 -0400 (EDT)
- References: <i13tq3$7gd$1@smc.vnet.net>
On Jul 8, 12:13 am, "S. B. Gray" <stev... at ROADRUNNER.COM> wrote:
> I have lists such as
>
> th = {227, 342, 527, 0, 670, 730, 703, 0, 0, 649, 687, 614, 570, 501,
> 462, 402, 325, 254, 189, 99, 81, 36, 9, 8, 3, 0, 0, 0, 0, 0, 0, 0,
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
>
> and I want to find the position of the last nonzero element (e.g. 3 at
> position 25). Trivial, but some poking around did not reveal a neat way.
>
> Anyone? Thank you.
>
> Steve Gray
This will do integer lists quite quickly,
and a similar function will do real lists.
In[2]:= InputForm[ poslastnzi = Compile[{{v, _Integer, 1}},
Module[{i = Length[v]}, While[i > 0 && v[[i]] == 0, i--]; i]] ]
Out[2]//InputForm=
CompiledFunction[{{_Integer, 1}}, {{2, 1, 0}, {2, 0, 0}},
{4, 4, 0, 0, 1}, {{1, 5}, {57, 0, 0}, {4, 0, 1},
{48, 1, 0, 0}, {41, 0, 6}, {64, 0, 0, 0, 0, 1}, {4, 0, 2},
{44, 1, 2, 1}, {8, 1, 3}, {42, 3}, {3, False, 2},
{8, 2, 3}, {41, 3, 6}, {9, 0, 1}, {4, 1, 2},
{89, 258, 2, 0, 1, 2, 0, 2, 2, 0, 3}, {9, 3, 0},
{42, -15}, {2}}, Function[{v}, Module[{i = Length[v]},
While[i > 0 && v[[i]] == 0, i--]; i]], Evaluate]
In[3]:= poslastnzi[th]
Out[3]= 25