|||
首先看下Array_Indices的功能:将数组的一维下标转换到数组的对应维上:
IDL> void = where(arr eq 14) IDL> idx = where(arr eq 14) IDL> print,idx 14 IDL> print,array_indices(arr,idx) 4 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] 2 3 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 |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-23 01:51
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社