PRO wheretomulti, Array, Indices, Col, Row, Frame
;+
; NAME: wheretomulti.pro
;
; FUNCTION: Convert WHERE output to 2d or 3d indices
;
; USAGE: WhereToMulti, Array, Indices, Col, Row, Frame
;
; INPUT ARGUMENTS:
; Array: the array that was WHERE'd
; Indices: the indices returned by WHERE
;
; OUTPUT ARGUMENTS:
; Col: Indices to first dimension.
; Row: Indices to second dimension.
; Frame: Indices to third dimension. Returned only for 3-d array.
;
; OPTIONAL ARGUMENTS:
;
; KEYWORDS:
;
; REQUIRED MODULES:
;
; SIDE EFFECTS:
;
; ERROR HANDLING:
; If Array is not a vector or matrix, all return values are set to zero
; and a message is written to the screen.
;
; NOTES:
;
; HISTORY:
; 1998 Sept 15 J.L.Saba Developed based on code from David Fanning's
; web site.
;
;- End of prologue -------------------------------------------------------------
;Find size of input array
s = SIZE ( Array )
;Size returns n_dimesnions, size_dimension(1), size_dimension(2) etc
;Size returns 0 dimensions if the variable does not exist.
;Number of columns of array =s[1]
NCol = s[1]
;The keyword MOD is the modulo operator. I MOD J is equal to the
;remainder when I is divided by J.
;Col(i) is column that Indices(i) refers to
Col = Indices MOD NCol
;since the indices count along the columns working up the rows
IF s[0] EQ 2 THEN BEGIN ; 2-d array
Row = Indices / NCol ;Integer/integer=integer - so wed on't get a fractional row
ENDIF ELSE IF s[0] EQ 3 THEN BEGIN ; 3-d array
NRow = s(2)
Row = ( Indices / NCol ) MOD NRow
Frame = Indices / ( NRow * NCol )
ENDIF ELSE BEGIN ; neither 2d or 3d
Col = 0
Row = 0
Frame = 0
PRINT, 'WhereToMulti called with bad input. Array not a vector or matrix.'
HELP, Array
ENDELSE
RETURN
END