where_tag.pro
来自「basic median filter simulation」· PRO 代码 · 共 170 行
PRO
170 行
function where_Tag, Struct, Nfound, TAG_NAME=Tag_Name, $ TAG_NUMBER=Tag_Num, $ ISELECT=ipart, NOPRINT=noprint, $ RANGE=range, VALUES=values;+; NAME:; WHERE_TAG; PURPOSE:; Like WHERE but works on structure tag names; EXPLANATION:; Obtain subscripts of elements in structure array for which; a particular Tag has values in a range or matching specified values.; Like the WHERE function but for use with structures; CATEGORY:; Structures; CALLING SEQUENCE:; w = where_tag( struct, [ Nfound, TAG_NAME=, TAG_NUMBER = , RANGE =, ; VALUES =, RANGE =, ISELECT =, /NOPRINT ];; INPUTS:; Struct = structure array to search.;; INPUT KEYWORDS:; User *must* specify (1) TAG_NAME or TAG_NUMBER to search, and (2); the VALUES or RANGE to search on;; TAG_NAME = Scalar string specifying Tag Name; TAG_NUMBER = otherwise give the Tag Number,; RANGE = [min,max] range to search for in Struct,; VALUES = one or array of numbers to match for in Struct,; ISELECT= specifies indices to select only part of structure array,; (use it to recycle subscripts from previous searches).; /NOPRINT = suppress informational messages about nothing found.;; OUTPUTS:; Nfound = # of occurences found.;; RESULT:; Function returns subscripts (indices) to desired elements.;; EXAMPLES:; Suppose STR is a structure with tags CAT_NO:indgen(10), and ; NAME:strarr(10). Find the indices where STR.CAT_NO is; between 3 and 5.;; IDL> print, WHERE_TAG( str, TAG_NAME = 'CAT_NO', VALUE = [3,4,5] ) ;or; IDL> print, WHERE_TAG( str, TAG_NUM = 0, RANGE = [3,5]) ;; PROCEDURE:; Get tag number and apply the WHERE function appropriately.;; MODIFICATION HISTORY:; written 1990 Frank Varosi STX @ NASA/GSFC; Stop printing "Tag <xxx> not found" with /NOPRINT, CD Pike 8-Jun-93;-;First check required parameters... Ntag = N_tags( Struct ) if (Ntag LE 1) then begin message,"expecting a Structure Array, try again...",/CONTIN return,[-1] endif if (N_elements( Tag_Num ) NE 1) AND $ (N_elements( Tag_Name ) NE 1) then begin message,"specify TAG_NAME= or TAG_NUMBER= to search",/CONTIN return,[-1] endif Tags = Tag_names( Struct ) if N_elements( Tag_Name ) EQ 1 then begin Tag_Name = strupcase( Tag_Name ) Tag_Num = where( Tags EQ Tag_Name ) Tag_Num = Tag_Num[0] if (Tag_Num LT 0) then begin if NOT keyword_set( noprint ) then $ message,"Tag <"+Tag_Name+"> not found",/CONTIN return,[-2] endif endif if (Tag_Num LT 0) OR (Tag_Num GE Ntag) then begin message,"Tag# " + strtrim(Tag_Num,2) + " exceeds Max Tag# " $ + strtrim(Ntag-1,2) + " in structure",/CONTIN return,[-1] endif if N_elements( ipart ) GT 0 then begin ;check if any searching ;on a subset of input. w = where( ipart GE 0, nf ) if (nf LE 0) then return,[-1] if (nf LT N_elements( ipart )) then ipart = ipart[w] endif;Now find out where for RANGE : if N_elements( range ) EQ 2 then begin if N_elements( ipart ) GT 0 then begin w = where( (Struct[ipart].(Tag_Num) GE range[0]) AND $ (Struct[ipart].(Tag_Num) LE range[1]), Nfound ) if (Nfound GT 0) then windex = ipart[w] else windex = w endif $ else windex = where( (Struct.(Tag_Num) GE range[0]) AND $ (Struct.(Tag_Num) LE range[1]), Nfound ) if (Nfound LE 0) AND (NOT keyword_set( noprint ) ) then begin strnums = strtrim( range, 2 ) string = strnums[0] + "," + strnums[1] message," NO values of <" + Tags[Tag_num] + $ "> found in the Range [" + string + "]",/CONTIN endif;where Values: endif else if N_elements( values ) GE 1 then begin Nval = N_elements( values ) vals = [values] Nfound = 0 if N_elements( ipart ) GT 0 then begin for v=0,Nval-1 do begin w = where( Struct[ipart].(Tag_Num) EQ vals[v], Nf ) if (Nf GT 0) then begin if (Nfound GT 0) then ww = [ww,w] else ww = w endif Nfound = Nfound + Nf endfor if (Nfound GT 0) then windex = ipart[ww[sort( ww )]] $ else windex = w endif else begin for v=0,Nval-1 do begin w = where( Struct.(Tag_Num) EQ vals[v], Nf ) if (Nf GT 0) then begin if (Nfound GT 0) then ww = [ww,w] else ww = w endif Nfound = Nfound + Nf endfor if (Nfound GT 0) then windex = ww[sort( ww )] $ else windex = w endelse if (Nfound LE 0) AND (NOT keyword_set( noprint ) ) then begin strnums = strtrim( vals, 2 ) string = strnums[0] for i=1,Nval-1 do string = string + "," + strnums[i] message," NO values of <" + Tags[Tag_num] + $ "> found Equaling [" + string + "]",/CONTIN endif endif else begin message,"must specify a RANGE=[#,#] or VALUES=#('s)",/CONTIN windex=[-1] endelsereturn, windexend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?