遥感图像处理及ENVI IDL操作实践 下载本文

2.2. 数组

IDL中可以为任何IDL数据类型创建1—8维的数组。数组操作的运行速度往往优于循环操作,且语法更为精炼。 在IDL中利用方括号“[ ]”创建数组。创建多维数组时可以使用嵌套的方括号。值的注意的是,IDL中数组元素的存储是按列进行的。按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。下标的顺序先是列标,后是行标。IDL的数组下标是从零开始的正值。数组的下标可以是标量也可以是矢量。进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。例如,创建一维数组vector和多为数组array:

; 创建一维数组vector IDL> vector=[1,2,3] IDL> help,vector

VECTOR INT = Array[3] IDL> print,vector

; 输出IDL 输出窗口中将会如下所示: 1 2 3

; 创建多维数组array IDL> array=[[1,2,3],[4,5,6]] IDL> help,array

ARRAY INT = Array[3, 2] IDL> print, array 1 2 3 4 5 6

IDL的内建函数允许用户按指定的类型创建数组,同时数组中的每个元素都被初始化为灵活索引值(下标值)。创建和初始化零数组和索引数组的函数见表2所示。

表2 创建和初始化零数组和索引数组的函数

数据类型 byte int long long64 uint ulong ulong64

零数组 bytarr( ) intarr( ) lonarr( ) lon64arr( ) uintarr( ) ulonarr( ) ulon64arr( ) 索引数组 bindgen( ) indgen( ) lindgen( ) l64indgen( ) uindgen( ) ulindgen( ) ul64indgen( ) 5 float double complex dcomplex string fltarr( ) dblarr( ) Complex arr( ) Dcomplex arr( ) strarr( ) findgen( ) dindgen( ) cindgen( ) dcindgen( ) sindgen( )

例如,创建一个七元素的整型零数组和一个六元素的浮点型索引数组:

IDL> zeros=intarr(7) ; 创建一个七元素的整型零数组 IDL> index=findgen(6) ; 创建一个六元素的浮点型索引数组 IDL> print,zeros,index

0 0 0 0 0 0 0

0.000000 1.00000 2.00000 3.00000 4.00000 5.00000

3. IDL编程基础

结构化程序设计是 E.W.Dijikstra 在 1965 年提出的。它的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造。编写 IDL 程序也需要对 IDL 中的相关控制语句进行简单介绍。

3.1. 定义和编译程序

IDL程序包括过程和函数两种:

(1). 过程(pro)

过程一般将几个相关的操作加到一个程序模块中。过程以pro开头,end结束。例如:

;过程名 test1, 参数 para1,para2,.. pro test1,para1,para2,... 过程语句块 end

(2). 函数(function)

函数一般将一个操作加载到一个程序模块中,并返回结果函数以function开头,end结束,并包括一个return语句返回结果。例如:

;函数名 test2,参数 para1,para2,..,返回值 para1 function test2,para1,para2,... 过程语句块 return ,para1 end

6

IDL 命令要么是过程,要么是函数。过程和函数的区别在于:在过程命令中,参数和关键字仅排列在一个命令行上;在函数命令中,位置参数和关键字参数放在一对圆括号中的。

但是,最重要的区别是IDL函数会返回一个值,等号左边的一个变量用于返回该值。这是IDL中函数命令和过程命令根本的区别。 函数命令总是返回一个值,这个数值必须赋给一个变量。函数返回值可能是任何一种IDL变量,包括数值、数组或结构。

3.2. 命名和编译源文件

命名一个IDL源文件的标志形式是在过程或函数名称后加上扩展名‘.pro’过程和函数都可以通过“.compile”命令进行手动编译或是通过IDL IDE环境进行编译。

当需要时,过程和函数会在运行时自动编译,如果IDL调用的过程或函数之前未被编译过,则IDL会搜索路径下所有的文件夹以搜索源文件的名称。

3.3. 程序控制语句

3.3.1. 条件语句 (1). IF 语句

当特定的条件为真时,if语句执行单个语句或单个语句模块: ? IF 条件 THEN 语句 ? IF 条件 THEN BEGIN

语句 ENDIF

? IF 条件 THEN 语句 ELSE 语句 ? IF 条件 THEN BEGIN

语句

ENDIF ELSE BEGIN 语句

ENDELSE

在以上的所有行驶中,“条件”是一个标量表达式,其值为真或假。在前两种形式中,当条件为真时,执行单个语句或语句模块;在后面两种行驶中,当条件为假时,“else”语句将执行单个的语句或语句模块。

7

(2). CASE 语句

CASE语句根据一个标量的表达式来选择某个语句或语句块运行。 CASE 表达式 OF 情况1: 情况2:语句 情况3:BEGIN 语句 END ELSE: 语句 ENDCASE

当表达式和其中的某个情况匹配,相应的语句被执行, case 语句结束,如果没有匹配的情况,那么执行 else 下的语句,如果没有 else 语句,将会发生错误,建议在case 语句中都加上else。 (3). SWITCH语句

SWITCH跟CASE类似,但与CASE的不同在于它能执行到底。

3.3.2. 跳转语句 (1). BREAK

BREAK提供了一个从循环中(FOR,WHILE)或CASE、SWITCH等状态中快速退出的方法。 (2). CONTINUE

CONTINUE 提供了一个从循环中(FOR, WHILE,和 REPEAT)中进入下一步循环的方法。以FOR为例,学习下CONTINUE的用法。 3.3.3. 循环语句 (1). FOR 语句

FOR 循环运用计数器来多次执行一个或语句块 ,该循环按特定的步长从初始值上升或下降至结尾值。

? FOR I=V1,V2 DO 语句 ? FOR I=V1,V2,INC DO 语句 ? FOR I=V1,V2,INC DO BEGIN 语句

8