IDL入门教程北京星图环宇科技有限公司王志成zcwang@imagetekinfo.com2006.3.23一、IDL基础•IDL是进行数据分析、可视化及跨平台应用开发的最佳选择。IDL集可视、交互分析、大型商业开发为一体,为您提供了最完善、最灵活最有效的开发环境。•IDL是美国RSI公司推出的面向矩阵的第四代计算机语言。IDL语言的特性•高级图像处理能力•交互式二维和三维图形技术•面向对象的编程方式•OpenGL图形加速•量化可视化表现•成数学与统计学算法•灵活的数据输入输出方式•跨平台图形用户界面工具包•连接ODBC兼容数据库•多种程序连接工具……IDL的发展•在国外IDL已经被列为大学的标准课程,其功能和应用效果完全可以替代如Matlab等其他同类科学计算应用软件。•在国内IDL要比国外稍微滞后,还处在推广和应用的初期。许多科研单位和一些大学在与国外单位交流中,特别是一些留学归国人员,是IDL在国内应用的先行者和忠实用户。•随着IDL应用和市场的广泛进入和从科研院所的高端应用到更广泛地民用化的接受过程,越来越多的人将了解和接受应用IDL。IDL程序示例:•IDLDE介绍•HellowWorld程序•Demo_tour本程序显示了IDL提供的丰富的demo程序。IDL基础•IDL表达式–.点命令–$行连接符–@执行IDL的批文件–;IDL程序注释符•IDL命令行输入–Journal使用Journal记录输入的命令–使用help,print查看变量的信息–查看帮助文档–如何在命令行输入多行命令IDL基础•IDL程序的类型–主程序启动程序与文件名一致–过程以Pro开头–函数以Function开头•IDL程序的位置参数和关键字–位置参数–关键字1.1、IDL变量•变量定义变量在使用前,无需说明类型。•变量的命名规则变量名称必须以字母和下划线开头,可以包括字母、数字、下划线、美元符号正确:•reade6_$file•only_8_bit•ComputerType•variables•_day_of_year错误:•name.last•third%file•4th_list•$temp•变量数据类型Byte字节型Int有符号整数Uint无符号整数Long有符号长整型Ulong无符号长整型Long6464位长整型Float浮点型Double双精度浮点型Complex复数Dcomplex双精度复数String字符串0-32767个字符Struct结构Pointer指针Objref对象的引用•数据类型的转换数据类型创建变量例子数据类型转换函数ByteVar=1BthisVar=Byte(variable)IntVar=1thisVar=Fix(variable)LongVar=1LthisVar=Long(variable)Long64Var=1LLthisVar=Long64(variable)UintVar=1UthisVar=Uint(variable)FloatVar=1.0thisVar=Float(variable)DoubleVar=1.0DthisVar=Double(variable)StringVar=‘’thisVar=String(variable)PointerVar=ptr_new()ObjectVar=obj_new()1.2、IDL数组•IDL数组运算简介IDL面向矩阵的特性保证数组运算时不用进行循环。IDL中使用数组的两个最大优势体现在:(1)数组操作比循环操作快得多(2)数组语法比相对的循环语法更加精练例子:对数组元素求和Npts=1000000LData=randomu(-1L,npts)Sum=total(data)IDL数组操作语句Sum=0.0Fori=0L,(npts-1L)dobeginsum=sum+data[i]循环语句•数组的创建(1)利用[]创建。(2)利用创建函数创建Bytebytarr()bindgen()Intintarr()indgen()longlonarr()lindgen()ulongulonarr()ulindgen()floatfltarr()findgen()doubledblarr()dindgen()stringstrarr()sindgen()make_arraymake_array(3,2,/byte)•数组的存储格式IDL中数组元素的存储是按列进行的。按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。•数组的下标数组的下标可以是标量也可以是矢量。进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。1.3、表达式和运算法则•表达式的书写规则表达式结果的类型将由表达式右边变量的类型决定。•运算符数学:+-*/^mod取小最大逻辑:NotEqNeLeLtGeGtAndOrXor数组:#数组乘(列乘行)##矩阵乘(行乘列)指针:*•运算符的优先级()指针^数组/mod+-Not逻辑1.4、数组运算•如果表达式中有一个变量是数组,结果也是数组•如果表达式左边是数组,右边是一个标量,则整个数组将被赋予该标量的值。A=[1,2,3,4]B=[3,4,5,6]A+B,A*BA=10.0B=[10.0,20.0,30.0,40.0]A+B,A*B•取大()、取小()操作分别返回自变量的最大值和最小值当自变量为数组时,取大、取小运算符将对数组对应的每一对元素依次操作。arr=[0,1,2,-9,5,6,-8,7,8]print,arr0a=[2,4,6,7]b=[4,5,5,6]print,ab•关系运算符eqneleltgegt返回一个数字结果,其中真值用‘1B’表示,假用’0B’表示。关系运算符也可以作用于数组的自变量,如果两个自变量都是数组,那么关系运算符将依次作用于两个数组中每一对对应的元素。a=1.0b=2.0help,agtbif(altb)thenprint,’True’a=5b=bindgen(9)print,bc=bleaPrint,ca=[2,4,6,8]b=[3,4,5,6]print,agtb可以用于屏蔽数组中的某些值。arr=indgen(9)mask=arrge5result=mask*arr1.5数组操作函数•数组元素的数目n_elements函数返回数组中所有元素的数目:arr=findgen(32,32)print,n_elements(arr)•数组的大小和类型size函数返回一个长整型的矢量结果,包含了输入数组的大小和类型信息。可选关键字n_dimensions,dimensions,type,tname,n_elements分别返回维数、每维的大小、类型代码、类型名称和元素个数arr=dist(256)help,arrprint,size(arr,/dimension)print,size(arr,/type)print,size(arr,/tname)print,size(arr,/n_elements)•最大值和最小值maxmin函数arr=dist(32)print,min(arr),max(arr)•总和total函数返回数组元素的总和,也可以添加可选变量来计算特定维度的元素总和。total函数还可以使用可选的关键字cumulative来计算累计的和。arr=indgen(3,3)print,total(arr)arr=indgen(9)print,total(arr,/cumulative)1.6数组中元素的定位•查找符合条件的值where函数返回数组或数组表达式中非零元素的下标,使用where函数和逻辑表达式可以查找符合条件的值。where函数允许引入一个可选变量count来检查是否找到符合条件的值。使用where函数时,数组使用一维下标arr=indgen(9)*10index=where(arrgt35)print,arr[index]1.7改变数组的维度和大小•改变数组的大小rebin()通过整数因子数组的大小congrid()调整数组到任意大小Arr=[20,30,40]resizeArr=rebin(arr,9,/sample)conArr=congrid(arr,9)conArr=congrid(arr,10)1.8结构•结构是由一组类型不同的常量、变量和数组组合而成的组合数据类型。结构中的每一个变量或者数组成为结构的成员。•结构分为匿名结构和署名结构两种,匿名结构是指没有名字的结构。如果在使用过程中,结构成员的个数和类型可能发生变化,一般使用匿名结构;否则使用署名结构。•匿名结构一般用于程序之间值的传递,署名结构主要用在事件结构中1.8.1匿名结构•创建:结构变量={成员1:表达式1,成员2:表达式2,…,成员n:表达式n}•赋值:格式:结构变量.成员=表达式•调用:结构变量.成员=表达式1.8.2署名结构•创建:结构变量={结构名,成员1:表达式1,成员2:表达式2,…,成员n:表达式n}1.8.3结构数组•结构数组可以使用已有的结构变量和函数REPLICATE创建,对于署名结构还可以使用结构名创建,其格式为:•格式1:结构数组名=REPLICATE(结构变量,D1[,…,D8])1.9指针•指针的创建指针变量=PTR_NEW([变量])•指针的调用*指针变量•检测指针的有效性result=ptr_valid(ptr)•指针的释放ptr_free,ptr•指针数组p_arr=ptrarr(d1,d2,d3,…)二、编写IDL程序2.1、定义和编译程序•过程(pro)过程一般将几个相关的操作加到一个程序模块中。过程以pro开头,end结束•函数(function)函数一般将一个操作加载到一个程序模块中,并返回结果函数以function开头,end结束,并包括一个return语句返回结果•命名和编译源文件命名一个IDL源文件的标志形式是在过程或函数名称后加上扩展名‘.pro’过程和函数都可以通过’.compile’命令进行手动编译或是通过IDLIDE环境进行编译。当需要时,过程和函数会在运行时自动编译,如果IDL调用的过程或函数之前未被编译过,则IDL会搜索路径下所有的文件夹以搜索源文件的名称。2.2控制语句•If语句if条件then语句if条件thenbegin语句endifif条件then语句else语句if条件thenbegin语句endifelsebegin语句endelse•Case语句case语句根据一个标量的表达式来选择某个语句或语句块运行。case表达式of情况1:情况2:语句情况3:begin语句endelse:语句endcase当表达式和其中的某个情况匹配,相应的语句被执行,case语句结束,如果没有匹配的情况,那么执行else下的语句,如果没有else语句,将会发生错误,建议在case语句中都加上elsetest_case.pro•For语句for语句每次循环执行一个语句或语句块fori=v1,v2do语句fori=v1,v2,incdo语句fori=v1,v2,incdobegin语句endfor默认条件下增量为1,也可以设定增量•While语句当特定的条件为真,while语句执行单个语句或语句块while条件do语句while条件dobegin语句endwhileTest_for.pro•Return语句return语句在当前程序单元中产生一个即时出口,并返回控制。return,结果return•Break语句break语句用来中断循环的执行break•Continue语句continue语句终止本次循环的执行,执行下次循环continueTest_return.proTest_break.proTest_continue.pro2.3参数和关键字•参数参数用来将变量和表达式传递到过程或函数中。参数有时也被称为位置参数,因为它们在自变量中的位置决定了它们在调用的过程或函数中