# ind_resolve

Resolves a single list of indices to their multi-dimensional representation.

## Prototype

function ind_resolve ( indices [*] : byte, short, integer or long, dsizes [*] : byte, short, integer or long ) return_val : integer or long

## Arguments

*indices*

A list of indices into a one-dimensional array that was converted to a one-dimensional array from a multi-dimensional array.

*dsizes*

A list of dimension sizes of the multi-dimensioned array mentioned above.

## Description

**ind_resolve** takes a list of indices into a
one-dimensional array (that was converted from a multi-dimensional
array) and returns the list of indices that they represent in the
multi-dimensional array. The array returned will be dimensioned
*N* x *M*, where *N* is the number of indices and
*M* is the length of *dsizes* (the number of dimensions
of the multi-dimensional array).

As of version 6.0.0, this function allows "long" input for the indices and/or dimension sizes, which potentially allows you to have values greater than or equal to 2 gigabytes (GB) on a 64-bit system. This function will return longs if on a 64-bit system and any of the values are >= 2 GB.

## See Also

**ind**,
**region_ind**,
**get1Dindex**,
**where**,
**ndtooned**,
**onedtond**

## Examples

**Example 1**

The following example demonstrates the usefulness of the
**ind_resolve** function in conjunction with the
**ind** function. Note that this code can be simplified
to two lines of code by the use of the **where**
function, which will be demonstrated below.

; ; Create sample multi-dimensioned array. ; The following creates a 3D array of size 2 x 2 x 4. ; a = (/(/(/1,2,3,4/), (/5,6,7,8/)/), (/(/9,10,9,8/),(/7,6,5,4/)/)/) ; ; Returns the index locations where "a" is greater than 5. ; NCL'sndtoonedis used to temporarily ; reshape "a" as is required by theindfunction. ; ; a1D =ndtooned(a) dsizes_a =dimsizes(a) indices =ind_resolve(ind(a1D.gt.5),dsizes_a)dimsizes(indices) npts = dim_ida(0) ; number of elements > 5 (here 9) ndim = dim_ida(1) ; rank of "a" (here 3) a@_FillValue = -999 do n=0,npts-1 a(indices(n,0),indices(n,1),indices(n,2)) = a@_FillValue end do

There are nine index locations where *a* is greater than 5:
(0,1,1), (0,1,2), (0,1,3), (1,0,0), (1,0,1), (1,0,2), (1,0,3),
(1,1,0), and (1,1,1). The above script, then, will return an array
dimensioned 9 x 3 with the following values:

Variable: indices Type: integer Total Size: 108 bytes 27 values Number of Dimensions: 2 Dimensions and sizes: [9] x [3] Coordinates: Number Of Attributes: 1 _FillValue : -999 (0,0) 0 (0,1) 1 (0,2) 1 (1,0) 0 (1,1) 1 (1,2) 2 (2,0) 0 (2,1) 1 (2,2) 3 (3,0) 1 (3,1) 0 (3,2) 0 (4,0) 1 (4,1) 0 (4,2) 1 (5,0) 1 (5,1) 0 (5,2) 2 (6,0) 1 (6,1) 0 (6,2) 3 (7,0) 1 (7,1) 1 (7,2) 0 (8,0) 1 (8,1) 1 (8,2) 1

After the do loop, the array *a* contains the following:

Variable: a Type: integer Total Size: 64 bytes 16 values Number of Dimensions: 3 Dimensions and sizes: [2] x [2] x [4] Coordinates: (0,0,0) 1 (0,0,1) 2 (0,0,2) 3 (0,0,3) 4 (0,1,0) 5 (0,1,1) -999 (0,1,2) -999 (0,1,3) -999 (1,0,0) -999 (1,0,1) -999 (1,0,2) -999 (1,0,3) -999 (1,1,0) -999 (1,1,1) -999 (1,1,2) 5 (1,1,3) 4

The above code can be drastically simplified by the use of
the **where** function:

a@_FillValue = -999 a =where(a.gt.5,a,a@_FillValue)

**Example 2**

Determine all locations of a multi-dimensional array (*x*)
where the elements match the minimum or maximum values. This is a more
general approach than offered by the **maxind** and
**minind** functions:

xMax =max(x) xMin =min(x) x1D =ndtooned(x) ; only do this once indMax =ind_resolve(ind(x1D.eq.xMax),dimsizes(x)) ; locations ofmaxindMin =ind_resolve(ind(x1D.eq.xMin),dimsizes(x)) ; locations ofmindelete(x1D)

**Example 3**

Assume *x* is a three-dimensional array with coordinate
variables (*time*,*lat*,*lon*). Print the
coordinates where -3 < *x* < 9. Before executing various
statements, check to make sure that at least some values of *x*
satisfy the criteria. Use the **num** function to test
if there are values between -3 and 9, then print the times, latitudes,
and longitudes:

if (num(x.gt.-3. .and. x.lt.9.) .gt. 0) then x1D =ndtooned(x) i1D =ind(x1D.gt.-3. .and. x1D.lt.9.) i =ind_resolve(i1D,dimsizes(x) ) ; 2D [npts,3] (rank(x)=3)delete(x1d) ; no longer neededdelete(i1d) end if