IDL开发专题-IDL运算符与ENVI波段运算举例

来源:互联网 发布:欧盟 知乎 编辑:程序博客网 时间:2024/06/05 05:05

原文网址:http://bbs.esrichina-bj.cn/esri/thread-46200-1-4.html

运算符是各个语言中必不可少的部分,IDL作为一种基于矩阵运算的语言,实际应用实际应用中运算符操作有很多的技巧。很多的时候一个语句能实现复杂的功能,这点在波段运算中能够体现出来。
1运算符
1.1数学运算符
   IDL中的数学运算符有加(+)、增运算(++)、减(-)、减运算(--)、乘(*)、除(/)、幂(^)、取余(mod)、取小(<)和取大(>)。
1.1增运算和减运算(++- -
   这两个运算跟C里面的是一样的;
   IDL> var = 20
   IDL> print,var++
   20
   IDL> print,var
   21
   IDL> var= indgen(2)
   IDL> print,var++
   0  1
   IDL> print,var
   1 2
1.2幂运算(^
   IDL> var = 2
   IDL> print,var^4
   16
   IDL> print,var^5
   32
   IDL> var = [2,3]
   IDL> print,var^2
   4 9
1.3取余运算(mod
   IDL> var = 32
   IDL> print,var mod 4
   0
   IDL> print,var mod 5
   2
   IDL> var = [2,3]
   IDL> print,var mod 2
   0 1
1.1.4取大和取小运算(><
IDL> var = 32
   IDL> print,var > 39
   39
   IDL> print,var < 39
   32
   IDL> var = [20,30]
   IDL> print,var >25
   25 30
1.2逻辑运算符
   IDL中逻辑运算有几个:&&,||,~
1.2.1&&
   逻辑的与运算,如果表达式为真或非零则返回1否则返回0
   IDL> PRINT, 5 && 2
   1
   IDL> PRINT, 5 && 0
   0
   IDL> PRINT, "sd" && "d"
   1
   IDL> PRINT, "sd" && " "
   1
   IDL> PRINT, "sd" && ""
   0
1.2.2||逻辑的或运算
   IDL> PRINT, 5 || 2
   1
   IDL> PRINT, 5 || 0
   1
   IDL> PRINT, 0 || 0
   0
   IDL> IF ((5 GT 3) || (4 GT 5))
   THEN PRINT, 'True'

   True
1.2.3~逻辑的非运算
   IDL> print,~3
   0
   IDL> print,~0
   1
1.3位运算符
   IDL中有四个位运算符:AND,NOT,OR, andXOR.
1.3.1位加运算符(AND
   IDL> print,5 AND 6
   4
   0110 5
   0111 6
   ————————
   0110 4
1.3.2位取反运算符(NOT
   IDL> print,not 1
   -2
1.3.3位或运算符(OR
   IDL> print,5 or 10
   15
   0101 5
   1010 10
   ————————
   1111 15
1.3.4位与或运算符(XOR
   IDL> print,3 XOR 5
   6
   0011 3
   0110 5
   ————————
   0110 6


1.4关系运算符
  IDL中的关系运算符包括EQNEGEGTLELT几个,关系运算符返回的是真“True”或假“False”。
1.4.1EQEqual to
等运算符,如果运算符两边相同则返回真,否则返回假;
  IDL> print,2 EQ 2.0
  1
  IDL> var = [2,3]
  IDL> print,var eq 2
  1 0
1.4.2NENot Equal to
  不等运算符,如果运算符两边不等则返回真,否则返回假;
  IDL> print,2 NE 2.0
  0
  IDL> print,2 NE 1
  1
  IDL> var = [2,3]
  IDL> print,var ne 2
  0 1
1.4.3GEGreater than or equal to
大于等于运算符,如果运算符两边左边大于等于右边则返回真,否则返回假;
  IDL> print,2 GE 1
  1
  IDL> var = [2,3]
  IDL> print,var ge 2
  1 1
1.4.4GTGreater than
大于运算符,如果运算符两边左边大于右边则返回真,否则返回假;
  IDL> print,2 GT 1
  1
  IDL> var = [2,3]
  IDL> print,var gt 2
  0 1
1.4.5LELess than or equal to
小于等于运算符,如果运算符两边左边小于等于右边则返回真,否则返回假;
  IDL> print,2 LE 1
  0
  IDL> print,2 LE 12
  1
  IDL> var = [2,3]
  IDL> print,var le 3
  1 1
1.4.6LTLess than
小于运算符,如果运算符两边左边大于右边则返回真,否则返回假;
  IDL> print,2 LT 1
  0
  IDL> print,2 LT 12
  1
  IDL> print,2 LT 2
  0
  IDL> var = [2,3]
  IDL> print,var lt 3
  1 0
1.4.6 数组间运算
  IDL> a =[2,3,5]
  IDL> b = [1,4,5]
  IDL> print,a GE b
  1  0 1
  IDL> b = [1,4,5,6]
  IDL> print,a GE b
  1 0 1
  IDL> print,a LE b
  0 1 1
1.5数组运算符
1.5.1#数组乘(列乘行)
  IDL> PRINT, array1
  1 2 1
  2 -1 2
  IDL> PRINT, array2
  1 3

  0 1
  1 1
  IDL> PRINT, array1#array2
  7  -1  7

  2  -1  2
  3   1  
1.5.2##矩阵乘(行乘列)

  IDL> PRINT, array1
  1 2  1
  2 -1 2
  IDL> PRINT, array2
  1 3

  0  1
  1 1
  IDL> PRINT, array1##array2
  2 6
  4 7
1.6其他运算符

1.6.1小括号()
表达式组合和控制一系列表达式的优先级;
  IDL> PRINT, 3 + 4 * 2 ^ 2 /2
  11
  IDL> PRINT, (3 + (4 * 2) ^ 2 / 2)
  35
1.6.2中括号[]

数组的连接或元素调用;
  IDL> C = [0, 1, 3]
  IDL> PRINT, [C, 5]
  0 1 3 5
  IDL> PRINT, C[2]
  3
1.6.3条件表达式?:

  该运算符的用法是:value = expr1 ? expr2 : expr3
  如果expr1true,那么 value 等于expr2否则value = expr3.
  IDL> A=6 & B=4
  IDL> print,(A GT B) ? A : B

  6
1.6.4对象方法调用符->

  oWindow->Draw
1.6.5指针引用符*

指针调用符为*,调用格式为*指针变量。
  IDL> point1 = ptr_New(34)
  IDL> print,*point1

  34

2运算符波段运算举例
2.1  数据小于0的赋予0  b1>0
2.2 数据值小于0的赋予-999

   (b1 LT 0)*-999+(b1 GE 0)*b1
2.3三个波段求平均值,如该波段小于0则不参加运算。如某点b1:4;b2:6;b3:0;那平均值ave = (b1+b2+b3)/(1+1);

  b1>0+b2>0+b3>0)/( ((b1 ge 0) + (b2 ge 0)+(b3 ge 0)) >1)
2.4两幅图像,图像1波段b1中的云部分(象元值大于200)用图像2的波段b2代替

  (b1 GT 200)*b2+(b1 LE 200)*b1


2.5波段分段赋值,如B1中小于0部分等于0b1中值在[0,10]之间赋为原数值的100倍,如果b1值大于10则赋为原数值的10倍。  (b1 LE 0)*b1>0 +((b1 ge 0)and (b1 le 10))*b1*100+ (b1 gt 10)*b1*10