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

```

• Prev by Date: image is not graphics
• Next by Date: Re: replacement x->y except in Exp[x]
• Previous by thread: Re: First nonzero in list
• Next by thread: FindMinimum numerical constraint functions