【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) 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)