近期,需要用到modis数据批量预处理,于是重新学习idl,感谢郭师兄推荐,以及张洋老师的详细教导。特以此为学习笔记,望学有所成。
IDL学习笔记(一)
- 数据类型
- 数据类型
- 创建数组
- 类型转换函数
- 代码输出
- 往文件中输出
- help查询命令
- 基础运算
- 关系运算
- 控制语句
- 第一次程序编写
- 函数编写
- 第一次作业
IDL注释为;
数据类型
数据类型
创建数组
Result = 函数([D1[,…,D8])至多八个维度
常见函数:
BYTARR: 字节型数组
DBLARR:双精度浮点型
FLTARR:浮点型数组
FINDGEN:浮点型索引数组
indgen:整型索引数组
STRARR:字符串
…
函数不区分大小写
BYTARR,DBLARR,FLTARR,INTARR, LON64ARR,LONARR,UINTARR,ULON64ARR,ULONARR,STRARR
BINDGEN,DCINDGEN, DINDGEN,FINDGEN,CINDGEN,LINDGEN,-SINDGEN,UINDGEN, UL64INDGEN, ULINDGEN
类型转换函数
BYTE, FIX, COMPLEX, DCOMPLEX, DOUBLE, FLOAT, LONG, LONG64, STRING,UINT, ULONG, ULONG64
整型 转换为 浮点型
a = indgen(5,5)
浮点型 转换为 整型
b = float(a)
FIX:转换为整型
IDL 中第一维是列,第二维是行,下标从0开始
代码输出
往文件中输出
openw,1,'D:/out.txt'
这里的1是硬盘的一个硬件存储位置,用1代替,运行后会创建一个txt
b=intarr(3,4)
printf,1,b
printf,1,'hello'
这个意思是往1当中,把b写进去。这里的1代指硬件地址。此时打开文件是看不到东西的,因为文件被idl占用了,所以需要归还文件,代码为:
free_lun,1
此时可以看到内容了。
注意:
此时再次,使用
openw,1,'D:/out.txt'
printf,1,'hello'
free_lun,1
此时文件中只剩下hello了,这是因为openw这个操作,不加其他关键字的时候,代表新建一个文件,若存在,则清空后新建,写入新的东西,原本东西不复存在。
那么如何保留之前的,继写呢?加关键字!
IDL> openw,1,'D:/out.txt',/append
这样就可以续写了!
help查询命令
HELP[,Expression1,…,ExpressionN]
查询对象相关信息
查询未知对象a的信息
help,a
可以输出数据类型 、行数、列数。
基础运算
创建数组的时候,一定要记住他的下标(几列几行)。且下标从0开始的。
a = findgen(3,4)
print,a[3,4]
上述代码是错误的,a没有第三列第四行,因为从0开始,下标最大只有[2,3]。
索引数组是从0开始,按行蛇形排列的。
IDL> a = findgen(3,4)
IDL> print,a
结果为:
0.00000 1.00000 2.00000
3.00000 4.00000 5.00000
6.00000 7.00000 8.00000
9.00000 10.0000 11.0000
关系运算
a = findgen(3,4)
print,a gt 5
结果为:
0 0 0
0 0 0
1 1 1
1 1 1
返回的是0或者1
(a gt 5) * a
print,c
这样就可以把大于5的保存,小于5的赋值为0,结果为
0.0000000 0.0000000 0.0000000
0.0000000 0.0000000 0.0000000
6.0000000 7.0000000 8.0000000
9.0000000 10.000000 11.000000
控制语句
第一次程序编写
pro program_name_firstClassprint,'helloa = 'cccc'print,aend
最基本的是:
pro 程序名程序题end
并且保存的文件名必须要 和 程序名 保持一致。
函数编写
如果需要函数,可以再pro前面先定义好function,比如
function fun_nameendpro program_name_firstClassprint,'helloa = fun_name
end
第一次作业
pro program_name_firstClassa = findgen(4,6)b = 3c = [3]d = [9,3,1]print,'a[3,4]'print,a[3,4]print,'a[15]'print,a[15]print,'a+b'print,a+bprint,'a[1,1]+b'print,a[1,1]+bprint,'a+c'print,a+cprint,'a+d'print,a+dend
输出:
a[3,4]
19.0000
a[15]
15.0000
a+b
3.00000 4.00000 5.00000
6.00000
7.00000 8.00000 9.00000
10.0000
11.0000 12.0000 13.0000
14.0000
15.0000 16.0000 17.0000
18.0000
19.0000 20.0000 21.0000
22.0000
23.0000 24.0000 25.0000
26.0000
a[1,1]+b
8.00000
a+c
3.00000
a+d
9.00000 4.00000 3.00000
解析:
① a[3,4]指的是第四列的第五行,行列不要搞混
② a+c等于一个单数3。是因为数组第二个元素维度不相同,则只有和【较小数组】一样大的元素进行相加后,得到结果。即c[0]+3 = 3.0000 ( 因为c是浮点数,所以默认是float )
pro program_name_firstClassa = [[3,9,10],[2,7,5],[4,1,6]]print,a
end
结果为:
3 9 102 7 54 1 6
pro program_name_firstClassa = [[3,9,10],[2,7,5],[4,1,6]]print,'a'print,ab = [[7,10,2],[5,8,9],[3,1,6]]print,'b'print,bc = a+bprint,'c'print,cd = a*bprint,'d'print,d
end
A*B是对应位置元素相乘。
结果为:
a3 9 102 7 54 1 6
b7 10 25 8 93 1 6
c10 19 127 15 147 2 12
d21 90 2010 56 4512 1 36
除法的时候,处于整数要小心,是否结果需要的是float
pro program_name_firstClassa = [[0,5,3],[4,0,2],[0,7,8]]b = [[0,0,1],[9,7,4],[1,0,2]]c = (a gt 3)*aprint,'a'print,aprint,'c'print,cprint,'b'print,bd = (b le 4)*b +(b gt 4)*9print,'d'print,de = (a+b)/2.0f = (a+b)/2print,'e'print,eprint,'f'print,fg = float(a+b)h = (a gt 0)+ (b gt 0)j = g/hprint,'j'print,j
结果为:
a0 5 34 0 20 7 8
c0 5 04 0 00 7 8
b0 0 19 7 41 0 2
d0 0 19 9 41 0 2
e0.00000 2.50000 2.000006.50000 3.50000 3.000000.500000 3.50000 5.00000
f0 2 26 3 30 3 5
j-NaN 5.00000 2.000006.50000 7.00000 3.000001.00000 7.00000 5.00000
解析:
- d = (b le 4)*b +(b gt 4)*9
- g = float(a+b)
h = (a gt 0)+ (b gt 0)
j = g/h
这两个逻辑关系要复习,在纸上画一下就可以知道为什么了