Re: Given a matrix, find position of first non-zero element in each
- To: mathgroup at smc.vnet.net
- Subject: [mg99567] Re: Given a matrix, find position of first non-zero element in each
- From: CaveSnow <cavesnow at gmail.com>
- Date: Fri, 8 May 2009 00:15:14 -0400 (EDT)
- References: <gtrl9k$242$1@smc.vnet.net> <gtudp6$j5j$1@smc.vnet.net>
On May 7, 12:39 pm, Szabolcs Horv=E1t <szhor... at gmail.com> wrote: > Nasser Abbasi wrote: > > This is a little problem I saw in another forum, and I am trying to als= o > > solve it in Mathematica. > > > Given a Matrix, I need to find the position of the first occurance of a > > value which is not zero in each row. > > > The position found will be the position in the orginal matrix ofcourse. > > > So, given this matrix, > > > A = { > > {0, 0, 5}, > > {50, 0, 100}, > > {0, 75, 100}, > > {75, 100, 0}, > > {0, 75, 100}, > > {0, 75, 100} > > }; > > > The result should be > > > {{1, 3}, {2, 1}, {3, 2}, {4, 1}, {5, 2}, {6, 2}} > > > This is how I solved this problem and after a bit of struggle. I wan= ted to > > see if I could avoid using a Table, and solve it just using Patterns an= d > > Position and Select, but could not so far. > > > Table[Flatten[{i, Flatten[Position[A[[i,All]], _?(#1 != 0 & ), 1, 1]]= }], {i, > > 1, 6}] > > > Out[174]= {{1, 3}, {2, 1}, {3, 2}, {4, 1}, {5, 2}, {6, 2}} > > > I am not happy with the above solution. I am sure there is a better one= (the > > above also do not work well when one row has all zeros). > > > Do you see a better and more elegant way to do this? > > Here's one solution: > > MapIndexed[{First[#2], 1 + LengthWhile[#1, # == 0 &]} &, A] Yet another one: In[23]:= Transpose[{Range[Dimensions[A][[1]]], Flatten[Position[#, _?(# != 0 &), 1, 1] & /@ A]}] Out[23]= {{1, 3}, {2, 1}, {3, 2}, {4, 1}, {5, 2}, {6, 2}}