第三章:IDL编程基础

标签:
idl开发编程基础过程和函数控制语句参数和关键字 |
分类: IDL开发 |
3.1 过程和函数
1、过程(无返回)
PRO 过程名 [,参数1,参数2,...,参数n,][,关键字1,关键字2,...,关键字n,]
END
例:角度转换为弧度:
1)无输入参数:
PRO radian
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\radian.pro'
% Compiled module: RADIAN.
IDL> radian
% Compiled module: RADIAN.
2)有输入参数:
PRO radian,deg
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\radian.pro'
% Compiled module: RADIAN.
IDL> radian,60
IDL> radian,150
IDL> radian,180
注意:在过程编译后,IDL进程中的任何语句和程序都可以调用该过程。但是,当IDL进程重启后需要重新编译到内存中,否则无法调用。
2、函数(有值返回)
FUNCTION 函数名 [,参数1,参数2,...,参数n][,关键字1,关键字2,...,关键字n]
END
调用方式为:
变量=函数名([,参数1,参数2,...,参数n][,关键字1,关键字2,...,关键字n])
例:角度转换为弧度:
FUNCTION radianf,deg
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\radianf.pro'
% Compiled module: RADIANF.
IDL> result1=radianf(60)
IDL> result1
IDL> radianf(180)
注意:在过程编译后,IDL进程中的任何语句和程序都可以调用该过程。但是,当IDL进程重启后需要重新编译到内存中,否则无法调用。
3、程序的相互调用
IDL的过程、函数之间可以相互调用,从而组合出更为复杂的应用。
例:计算长方体体积
PRO volumep
END
FUNCTION volumep,x,y,z
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\volumef.pro'
% Compiled module: VOLUMEF.
IDL> .compile -v 'D:\005-IDL\Default\my_pro\volumep.pro'
% Compiled module: VOLUMEP.
IDL> volumep
% Compiled module: VOLUMEP.
长方体体积
3.2控制语句
IDL有三种基本的程序结构:顺序结构、选择结构和循环结构。
1、选择结构
(1)IF语句
1)当if后面条件表达式为真时,执行语句序列。
IF 条件表达式 THEN 语句
或者
IF 条件表达式 THEN BEGIN
ENDIF
2)当if后面条件表达式为真时,执行语句序列;当条件表达式为假时,执行endelse后面的语句序列。
IF 条件表达式 THEN 语句1 ELSE 语句2
或者
IF 条件表达式 THEN BEGIN
ENDIF ELSE BEGIN
ENDELSE
3)当if后面条件表达式为真时,执行语句序列;当条件表达式为假时,执行endelse后面的语句序列;……;直到endelse为止。
IF 条件表达式1 THEN BEGIN
ENDIF ELSE IF 条件表达式2 THEN BEGIN
ENDIF ELSE IF 条件表达式3 THEN BEGIN
ENDIF ELSE BEGIN
ENDELSE
注意:在使用if语句时,需要注意if与endif,else与endelse必须配对使用,else语句以endelse结束而不是endif。
例1:if语句应用实例:
,计算y值。
FUNCTION test1,x
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\test1.pro'
% Compiled module: TEST1.
IDL> TEST1(25)
IDL> TEST1(-25)
例2:if语句嵌套应用实例:
,计算y值。
FUNCTION test2,x
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\test2.pro'
% Compiled module: TEST2.
IDL> TEST2(25)
IDL> TEST2(0)
IDL> TEST2(-25)
(2)CASE语句
CASE 表达式0 OF
ELSE:语句n+1
ENDCASE
例:输入0-9数字,输出英语:
PRO number,n
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\number.pro'
% Compiled module: NUMBER.
IDL> number,1
one
IDL> number,5
five
IDL> number,9
nine
(3)SWITCH语句
SWITCH 表达式0 OF
ELSE:语句n+1
elseswitch
注意:如果switch语句执行过程中想在某条语句执行完之后退出,需要在这一语句条后面加上break语句。Break语句能够直接跳出switch语句,转向endswitch语句后面的语句。
例:输入0-9数字,输出英语:
PRO snumb,n
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\snumb.pro'
% Compiled module: SNUMB.
IDL> SNUMB,1
one
IDL> SNUMB,5
five
IDL> SNUMB,7
seven
2、循环结构
(1)FOR语句
FOR i=m,n DO 语句
或者
FOR i=m,n,inc DO 语句
或者
FOR i=m,n,inc DO BEGIN
ENDFOR
注:当i从m以步长inc(若不设置,默认为1)逐步变化到n时,循环执行语句。
例:计算1-100所有整数之和:
PRO total100
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\total100.pro'
% Compiled module: TOTAL100.
IDL> total100
% Compiled module: TOTAL100.
(2)WHILE语句
WHILE 条件表达式 DO 语句
或者
WHILE 条件表达式 DO BEGIN
ENDWHILE
例:计算1-100所有整数之和:
PRO total_while
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\total_while.pro'
% Compiled module: TOTAL_WHILE.
IDL> total_while
% Compiled module: TOTAL_WHILE.
(3)REPEAT语句
REPEAT 条件表达式 UNTIL 语句
或者
REPEAT BEGIN
ENDREP UNTIL 条件表达式
例:计算1-100所有整数之和:
PRO total_rep
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\total_rep.pro'
% Compiled module: TOTAL_REP.
IDL> total_rep
% Compiled module: TOTAL_REP.
(4)循环语句的嵌套
例:判断一个数字是否为素数。
PRO qiantao,num
END
保存、编译并调用:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\qiantao.pro'
% Compiled module: QIANTAO.
IDL> QIANTAO,5
该数字是素数
IDL> QIANTAO,99
该数字是素数
IDL> QIANTAO,500
该数字是素数
3、CONTINUE和BREAK语句
例:continue举例:
PRO continue_test
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\continue_test.pro'
% Compiled module: CONTINUE_TEST.
IDL> continue_test
% Compiled module: CONTINUE_TEST.
例:break举例:
PRO break_test
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\break_test.pro'
% Compiled module: BREAK_TEST.
IDL> break_test
% Compiled module: BREAK_TEST.
4、综合举例
PRO computations
END
保存、编译与运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\computations.pro'
% Compiled module: COMPUTATIONS.
IDL> computations
% Compiled module: COMPUTATIONS.
大马:
3.3参数和关键字
1、参数
IDL的参数主要用于程序相互调用过程中值的传递。
PRO/FUNCTION 过程名/函数名,参数1,参数2,...,参数n
例:
PRO canshu,a
END
保存、编译并运行:
% Compiled module: CANSHU.
IDL> canshu,5
例:
IDL> systime()
Sat Mar 17 21:49:40 2018
IDL> systime(0)
Sat Mar 17 21:49:45 2018
IDL> systime(1)
2、关键字
PRO/FUNCTION
注:等号左边是关键字名,仅起标识作用,而右边的关键字变量才是过程/函数运行时真正正使用的变量。
例:
IDL> arr=fltarr(10,20)
IDL> size(arr)
IDL> size(arr,/dimensions)
IDL> size(arr,dimensions=1)
IDL> size(arr,dimensions=0)
3、值传递和地址传递
注:IDL参数和关键字的类型决定了它是按照地址传递还是值传递。变量名、数组名、结构体名和指针代表着数据的地址,因为这些作为参数或关键字的时候其传递方式为地址传递;而常量、子数组、结构体的域和表达式作为参数或关键字的时候其传递方式为值传递。另外,系统变量因为不允许被改变,其作为参数或关键字的时候也是值传递。
例:
IDL> data=[4,5,6]
IDL> data^2
IDL> data
IDL> data[*]^2
IDL> data
4、参数和关键字的检测
函数n_params()用于统计参数的数目:
函数keyword_set()用于检测某参数/关键字是否被设定,如果该参数/关键字已经设定,返回值为1,否则为0.
例:
PRO setting_check,p1,p2,k1=k1
END
保存、编译并运行:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\setting_check.pro'
% Compiled module: SETTING_CHECK.
IDL> setting_check
% Compiled module: SETTING_CHECK.
参数数目:
参数p1是否被设定:
参数p2是否被设定:
参数k1是否被设定:
3.4变量的作用域
1、局部变量
例:
PRO lob1
END
PRO lob2
END
编译lob2、编译lob1并运行lob1:
IDL> .compile -v 'D:\005-IDL\Default\my_pro\lob2.pro'
% Compiled module: LOB2.
IDL> .compile -v 'D:\005-IDL\Default\my_pro\lob1.pro'
% Compiled module: LOB1.
IDL> lob1
% Compiled module: LOB1.
A
B
C
lob1中的变量:a=
lob2中的变量:b=
lob1中的变量:a=
2、全局变量
例:
PRO comm1
END
PRO comm2
END
IDL> .compile -v 'D:\005-IDL\Default\my_pro\comm1.pro'
% Compiled module: COMM1.
IDL> .compile -v 'D:\005-IDL\Default\my_pro\comm2.pro'
% Compiled module: COMM2.
IDL> comm1
% Compiled module: COMM1.
IDL> comm2
% Compiled module: COMM2.
a=
注:公共变量块就像一个纽带,将不同的过程/函数联系起来。但是使用公共变量会降低程序的通用型和可移植性。
3.5其他
1、IDL程序优化
(1)以数组为操作主体
IDL是面向数组的语言,能够对数组直接进行运算。在编程过程中要尽量对数组整体进行运算,而不要使用循环对数组元素进运算。
例:内存中有一个NDVI数据(1000行×1000列),要求计算所有大于等于0.3的像元NDVI值的平均值。
For循环实现:
PRO ndvi_test,ndvi_cal
END
Where和mean函数实现:
PRO ndvi_test2,ndvi_cal
END
编译ndvi_test和ndvi_test2,调用:
IDL> ndvi_cal=randomu(undefinevar,1000,1000)
IDL> .compile -v 'D:\005-IDL\Default\my_pro\ndvi_test.pro'
% Compiled module: NDVI_TEST.
IDL> ndvi_test,ndvi_cal
耗时(秒):
IDL> .compile -v 'D:\005-IDL\Default\my_pro\ndvi_test2.pro'
% Compiled module: NDVI_TEST2.
IDL> ndvi_test2,ndvi_cal
耗时(秒):
(2)内存管理
用法:delvar,var1,var2,...,varn
例:
IDL> a=randomu(undefinevar,1000,1000)
IDL> help,a
A
IDL> delvar,a
IDL> help,a
A
用法:temporary(var)
例:
IDL> a=randomu(undefinevar,1000,1000)
IDL> help,a
A
IDL> b=temporary(a)*10
IDL> help,a,b
A
B
例:
IDL> a=randomu(undefinevar,1000,1000)
IDL> help,a
A
IDL> a=!Null
IDL> help,a
A
2、调用外部命令
语法:spawn[,command][,/hide]
参数command为待执行的命令,关键字hide用于隐藏命令行窗口。
例:
IDL> spawn,'start "" "D:spanw_test.txt"',/hide
http://s4/bmiddle/0070Uystzy7iZcU09Gzb3&690