如有研究需要数据,请与QQ1807232;或微信扫码添加客服咨询

【IDL】 数组下标转换一维坐标索引函数:array_indices_reverse

【IDL】 数组下标转换一维坐标索引函数:array_indices_reverse

首先看下Array_Indices的功能,将数组的一维下标转换到数组的对应维上去:

IDL> void = where(arr eq 14)

IDL> idx = where(arr eq 14)

IDL> print,idx

         14

IDL> print,array_indices(arr,idx)

                   1

IDL> print,arr[4,1]

     14

那么反过来呢,比如arr = indgen(4,5,6)和索引数组inxarr = [2,3,4]能否快速求arr[2,3,4]的值呢?

直接用变量下标的方式是不通的,IDL会认为是三个单独的下标,即:

IDL> arr = indgen(4,5,6)

IDL> idx = [2,3,4]

IDL> print,arr[2,3,4]

     94

IDL> print,arr[idx]

                4

解决方法有下面两个:

1) 利用Execute函数,示例代码

IDL> arr = indgen(4,5,6)

IDL> idx = [2,3,4]

IDL> str = 'result=arr['

IDL> for i=0,n_elements(idx)-1 do str = str+string(idx[i])+','

IDL> void = execute(str+'0]')

IDL> print,result

     94

2) 利用函数array_indices的反函数array_indices_reverse,示例代码

IDL> dirIdx = array_indices_reverse(arr,idx)

IDL> print,arr[dirIdx]

     94

附array_indices_reverse函数代码:

; 函数名:
;  array_indices_reverse
;
; 说明:
;   输入一个数组和多维下标,返回其一维下标索引
;   可以看作是Array_indices的反函数
;
; 调用方法
;  Result = array_indices_reverse (Array, Index)
;
; 返回值
;   返回索引下标数组对应的一维下标值
;
; 调用示例:
;IDL> arr = indgen(7,8,4,5)
;IDL> print,arr[2,3]
;     23
;IDL> print,array_indices_reverse(arr,[2,3])
;         23
;IDL> print,arr[5,3,2]
;    138
;IDL> print,array_indices_reverse(arr,[5,3,2])
;        138
;
; 版本历史:
;  Written by: DYQ 2011年10月29日
;- 

function array_indices_reverse, array, indexArr, DIMENSIONS=dimensions

   compile_opt idl2
   ON_ERROR, 2
   
   ;错误检测
    if (N_PARAMS() ne 2) then $

       MESSAGE, 'Incorrect number of arguments.'

   ;数组的下标

   arrDims = size(array,/dimen)

   ;下标个数   

   idxNum  = N_Elements(indexArr)

  if idxNum GT 1 then return,long(indexArr[idxNum-1]*product(arrDims[0:idxNum-2])+array_indices_reverse(array,indexArr[0:idxNum-2])) $

  else return,indexArr

end