IDL学习笔记(一)数据类型、基础运算、控制语句
近期,需要用到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_firstClass
print,'hello
a = 'cccc'
print,a
end
最基本的是:
pro 程序名
程序题
end
并且保存的文件名必须要 和 程序名 保持一致。
函数编写
如果需要函数,可以再pro前面先定义好function,比如
function fun_name
end
pro program_name_firstClass
print,'hello
a = fun_name
end
第一次作业
pro program_name_firstClass
a = findgen(4,6)
b = 3
c = [3]
d = [9,3,1]
print,'a[3,4]'
print,a[3,4]
print,'a[15]'
print,a[15]
print,'a+b'
print,a+b
print,'a[1,1]+b'
print,a[1,1]+b
print,'a+c'
print,a+c
print,'a+d'
print,a+d
end
输出:
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_firstClass
a = [[3,9,10],[2,7,5],[4,1,6]]
print,a
end
结果为:
3 9 10
2 7 5
4 1 6
pro program_name_firstClass
a = [[3,9,10],[2,7,5],[4,1,6]]
print,'a'
print,a
b = [[7,10,2],[5,8,9],[3,1,6]]
print,'b'
print,b
c = a+b
print,'c'
print,c
d = a*b
print,'d'
print,d
end
A*B是对应位置元素相乘。
结果为:
a
3 9 10
2 7 5
4 1 6
b
7 10 2
5 8 9
3 1 6
c
10 19 12
7 15 14
7 2 12
d
21 90 20
10 56 45
12 1 36
除法的时候,处于整数要小心,是否结果需要的是float
pro program_name_firstClass
a = [[0,5,3],[4,0,2],[0,7,8]]
b = [[0,0,1],[9,7,4],[1,0,2]]
c = (a gt 3)*a
print,'a'
print,a
print,'c'
print,c
print,'b'
print,b
d = (b le 4)*b +(b gt 4)*9
print,'d'
print,d
e = (a+b)/2.0
f = (a+b)/2
print,'e'
print,e
print,'f'
print,f
g = float(a+b)
h = (a gt 0)+ (b gt 0)
j = g/h
print,'j'
print,j
结果为:
a
0 5 3
4 0 2
0 7 8
c
0 5 0
4 0 0
0 7 8
b
0 0 1
9 7 4
1 0 2
d
0 0 1
9 9 4
1 0 2
e
0.00000 2.50000 2.00000
6.50000 3.50000 3.00000
0.500000 3.50000 5.00000
f
0 2 2
6 3 3
0 3 5
j
-NaN 5.00000 2.00000
6.50000 7.00000 3.00000
1.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
这两个逻辑关系要复习,在纸上画一下就可以知道为什么了