MathGroup Archive 2010

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

Search the Archive

Re: find index in an array

  • To: mathgroup at smc.vnet.net
  • Subject: [mg108160] Re: find index in an array
  • From: Bill Rowe <readnews at sbcglobal.net>
  • Date: Tue, 9 Mar 2010 06:25:35 -0500 (EST)

On 3/8/10 at 6:15 AM, dflatin at rcn.com (Daniel Flatin) wrote:

>I work in an environment where another system is the dominant
>analysis tool. In porting some code to my preferred work
>environment, Mathematica, I find that I occasionally need to
>reinvent functionality found in the other system. One such function
>is find(). In that system, this function returns all the non-zero
>indices in an array. Usually, this test array is the consequence of
>a logical operation on each element, so that in the that system

>indx == find(A > 3);

>returns all the indices for which elements of A are greater than 3.
>I have replicated this functionality in Mathematica, and I wanted to
>both share it, and maybe get some input in how I could make it more
>efficient or more elegant. One of the ways I learn to program in
>Mathematica is to analyze all the various responses to simple
>questions here, and I am hoping to steer the process here.

>Here is my function:

>findIndex[ array_?ArrayQ, test_ ] :== Module[
>{n==Length[Dimensions[array]],idx}, idx ==
>Cases[MapIndexed[If[test[#1],#2]&,array,{n}],{__Integer},n];
>If[n====1,Flatten[idx],idx]
>]

>example:

>(* set a *)

>a ==
>{{{0.08896779137,0.08522648397},{0.1162297255,0.4316697935}},{{0.
>6409512512,0.3506400003},{0.1156346501,0.
>9537010025}},{{0.8820963106,0.9962655552},{0.004333293427,0.
>727745896}}};

>indx == findIndex[a, 0.3 < # < 0.7&]

>output:

>{{1, 2, 2}, {2, 1, 1}, {2, 1, 2}}

>If any readers has some insight into a more compact, elegant, or
>Mathematica-like approach to this findIndex function, please feel
>free to respond.

Elegance is somewhat subjective. But here is another approach.

In[21]:= Most[ArrayRules[SparseArray[Clip[a, {.3, .7}, {0,
0}]]]] /.
  HoldPattern[a_ -> _] :> a

Out[21]= {{1, 2, 2}, {2, 1, 1}, {2, 1, 2}}

This could be made more general by replacing Clip with a
function that makes the elements you aren't interested in 0.
That function would then applied to each element using Map.



  • Prev by Date: Re: Automating a finite element procedure
  • Next by Date: Re: Why can't Mathematica tell when something is algebraically zero?
  • Previous by thread: Re: find index in an array
  • Next by thread: Re: find index in an array