IDL可视化入门与提高

更新时间:2024-03-21 21:07:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第二章 IDL可视化入门与提高 2.1 交互式与编译式

2.1.1 交互式模式

交互式模式可以利用简洁有效的单行命令快速进行数据分析和实现可视化。在交互式模式下,命令在IDL提示符下输入,并且当用户按回车键时执行

输入如下命令:

X = findgen(201)*0.1 ; 创建一个包含了201个元素的浮点数组,第一个元素为0.0,步长为0.1

Y = sin(x) ;创建浮点数组x的正弦函数数组 Plot,x,y; 绘出sin(x)的函数

交互模式最大的有点是,用户工作的结果能迅速地在图像、图形等窗口中实现可视化

2.1.2 编译模式 在此先不做介绍

2.2变量

IDL创建变量时,不需要对变量进行类型声明

IDL> var = 2.0;创建一个浮点型变量,对变量进行初始化 IDL> help,var

VAR FLOAT = 2.00000

重新定义为整型

IDL> var = 2;创建一个整型变量,对变量进行初始化 IDL> help,var

VAR INT = 2

2.2.2跟踪变量类型

无论在IDL的命令行,还是在IDL的程序中,使用“help”命令始终是帮助显示变量类型和大小的有效途径

对于标量类自变量在上列中以给出说明,在此不做赘述

对于数组类变量,“help”命令显示自变量的名称、大小、类型

IDL> arr = [12,13,14] IDL> help,arr

ARR INT = Array[3]

2.2.3数据类型的转换

IDL自身提供了变量转换函数

IDL> x = 3.141567 IDL> help,x

X FLOAT = 3.14157 IDL> fix(x) fix(x) ^

% Syntax error. IDL> x = fix(x) IDL> help,x

X INT = 3 IDL> x = byte(x) IDL> help,x

X BYTE = 3

如果要转换为byte,字节型变量,在转换的过程中只有最不重要的八位会转换过来,即最后面的八位 列入:

Var = 567; 567转换为二进制为1000110111 Var = byte(var); 只会保留最后面的八位,0110111 Help,var;最后得到的结果是55

IDL中默认的整数数据是16为有符号整型

2.2.4浮点数想整型的转换

当fix 和 long函数使用于浮点型变量向整数型变量转换时,将会发生截断现象

IDL> x = [4.23,4,56] IDL> print,x

4.23000 4.00000 56.0000 IDL> print,fix(x) 4 4 56

IDL> arr = [3.14,7.89,-5.7,-9.8] IDL> print,arr

3.14000 7.89000 -5.70000 -9.80000 IDL> print,fix(arr)

3 7 -5 -9 IDL> ;x

IDL> ;将浮点数组转换为整数型数组,数组中所用元素舍去小数点后的数字 IDL> print,long(arr)

3 7 -5 -9 IDL> print,round(arr);对数组中的每个元素进行四舍五入 3 8 -6 -10

IDL> print,floor(x);小于或等于自变量且最接近自变量的长整型整数 4 4 56 IDL> print,floor(arr)

3 7 -6 -10

IDL> print,cei(arr);大于或等于且最接近自变量的长整型整数 % Variable is undefined: CEI.

% Execution halted at: $MAIN$ IDL> print,ceil(arr)

4 8 -5 -9

2.2.5字符串和数字类型之间的转换

字符串变量可以转换为数字类型(里面含有数字数值)

IDL> print,float('3.2') 3.20000

IDL> print,float('123abc') 123.000

如果不包含数字数值,那么在转换时IDL会给出一个警告信息,并输出解果0

IDL> print,float('wode')

% Type conversion error: Unable to convert given STRING to Float. % Detected at: $MAIN$ 0.000000

当变量的字节类型向字符串类型转换时,输出结果是一个标量变量,该变量是对应于输入变量的ASCII码字符

IDL> print,string([47B,48B]) /0

当变量的字符串类型想字节类型转换时,输出结果是一个数组,其元素值是对应于输入字符串中每个字符的ASCII值

IDL> help,byte('ABC')

BYTE = Array[3] IDL> print,byte('ABC') 65 66 67

2.2.6变量的名称

IDL中变量的名称必须以字母开头,它们可以包括其他字母、数字、下划线、美元符号。 2.3数组简介

在IDL中可以为任何IDL数据类型创建1~8维数组。紧凑的数组语法能保证数组运行时不适用循环操作。数组操作的优点体现在运行速度上 2.3.1创建数组

在IDL中利用方括号【】,创建数组 创建一维数组

IDL> x = [1,2,3,4,5] IDL> help,x;用于显示x的大小

X INT = Array[5] IDL> print,x;输出x的值

1 2 3 4 5

创建多维数组

IDL> x = [[1,2,3],[4,5,6]];创建两行三列的数组 IDL> print,x

1 2 3 4 5 6 IDL> ;输出x IDL> help,x

X INT = Array[3, 2]

IDL> ;输出x的横列号,对于IDL中的数组【m,n】,m为列,n为行

值可以附加到已经存在的数组中

IDL> y = [[x],[6,7,8]] IDL> print,x

1 2 3 4 5 6 IDL> print,y

1 2 3 4 5 6 6 7 8

2.3.3创建数组的函数

IDL的内建函数允许用户按给定的类型创建数组,同时数组中的每一个元素都被初始化为0(intarr),或被初始化为在数组中的索引值(indgen)

IDL> zeros = intarr(6);创建一个元素值都为0的数组 IDL> help,zeros

ZEROS INT = Array[6] IDL> print,zeros

0 0 0 0 0 0 IDL> print,float(zeros);转换为浮点数组

0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 IDL> index = indgen(6);创建索引数组 IDL> print,index

0 1 2 3 4 5 IDL> index = indgen(3,5) IDL> help,index

INDEX INT = Array[3, 5] IDL> print,index;建立多维索引数组

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Replicate函数将创建一个特定维数的数组,并将某个标量值复制到该数组中

IDL> arr = replicate(5,3,2);创建元素值为5的2行3列数组 IDL> print,arr;输出数组 5 5 5 5 5 5

Make_array函数将创建一个特定维数的数组,给数组可以是零数组IDL> zeroed = make_array(3,2) IDL> print,zeroed

0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 创建索引数组

IDL> index = indgen(6);创建索引数组 IDL> print,index

0 1 2 3 4 5 IDL> index = indgen(3,5) IDL> help,index

INDEX INT = Array[3, 5] IDL> print,index

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

IDL> arr = replicate(5,3,2);创建元素值为2的2行3列数组 IDL> print,arr;输出数组 5 5 5 5 5 5

IDL> zeroed = make_array(3,2,/fix)

% Keyword FIX not allowed in call to: MAKE_ARRAY % Execution halted at: $MAIN$ IDL> zeroed = make_array(3,2) IDL> print,zeroed

0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

IDL> index = make_array(3,2,/float,/index);创建一个两行三列的数组,数组中的元素类型为浮点型,元素值为索引值 IDL> print,index

0.000000 1.00000 2.00000 3.00000 4.00000 5.00000

IDL> index = make_array(6,\\long,value = 32L);创建一个数组元素为32的长整型索引数组

index = make_array(6,\\long,value = 32L);创建一个数组元素为32的长整型索引数组 ^

% Illegal character in program text.

IDL> index = make_array(6,/long,value = 32L);创建一个数组元素为32的长整型数组 IDL> help,index

INDEX LONG = Array[6] IDL> print,index

32 32 32 32 32 32

2.3.4浮点网格数组

IDL中可以任意步长创建精确而有效的一维网格数组。

要求创建这样的一个浮点数组,它的元素值从1000.0按步长0.23均匀地上升到1010.0.

IDL> x1 = 1000.0 IDL> x2 = 1010.0 IDL> dx = 0.25 IDL> a = 1.0e-5+2 IDL> print,a 2.00001

IDL> nx = floor((x2-x1)/dx)+1L IDL> help,nx

NX LONG = 41

IDL> arr = lindgen(nx)*dx + x1;创建一个含有nx个元素,步长为dx的数组 IDL> help,arr

ARR FLOAT = Array[41] IDL> print,arr[39:41],format = '(5f11.4)'

% Subscript range values of the form low:high must be >= 0, < size, with low <= high: ARR.

% Execution halted at: $MAIN$ IDL> print,arr[38:40],format='(5f11.4)' 1009.5000 1009.7500 1010.0000

2.4数组下标

第一种形式是将下表用方括号括起来以形成一个数组的名称

IDL> arr = indgen(10)*3;创建以为索引数组,数组的步长为3 IDL> print,arr

0 3 6 9 12 15 18 21 24 27 IDL> index = 5 IDL> print,arr[index] 15

IDL> print,arr,format='(5i6)' 0 3 6 9 12 15 18 21 24 27 IDL> print,arr[7] 21

第二种形式是将下标用方括号括起来,并将数组的描述放在小括号内

IDL> index = 5;

IDL> print,(arr*10)[index] 150

数组下标同样可以表示为数组的形式

IDL> index = [3,5,7,4,2] IDL> print,arr[index]

9 15 21 12 6

当使用下标表示数组的形式时,如果某些下标超出了范围,则该下标将被转换为在允许范围内的最小或最大值

IDL> index = [-1,0,6,9,1000] IDL> print,arr[index]

0 0 18 27 27

2.4.1数组下标的示例

IDL> arr = indgen(8)*8;创建步长为8的索引数组 IDL> print,arr

0 8 16 24 32 40 48 56 IDL> ;标量下标 IDL> print,arr[5] 40 IDL> ;下标范围 IDL> print,arr[3:5] 24 32 40 IDL> ;所有下标

IDL> print,arr[*]

0 8 16 24 32 40 48 56 IDL> ;从特定下标之后的所有下标 IDL> print,arr[5:*] 40 48 56 IDL> ;下标用数组表示 IDL> index = indgen(2) IDL> print,arr[index] 0 8

IDL> ;下标用变量表达式表示 IDL> i = 3

IDL> print,arr[i-1:i+1] 16 24 32

2.4.2多维数组下标的示例

IDL> arr = indgen(5,3)*2 IDL> print,arr

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 IDL> ;标量的下标,取12 IDL> print,arr[2,1] 14

IDL> ;包含所有第一行元素的下标 IDL> print,arr[*,0]

0 2 4 6 8 IDL> ;包含所有第一列元素的下标 IDL> print,arr[0,*] 0 10 20

IDL> ;跨越两个维度的下标 IDL> print,arr[0:2,0:1] 0 2 4 10 12 14

2.4.3一维下标

无论数组的维数是多少,它总可以用一位数组来表示。也就是说,用户可以设置一个特定的下标,从零开始按多维数组中存储元素的顺序来标记多维数组中的每个元素

IDL> arr = indgen(5,3)*1 IDL> print,arr

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 IDL> ;取元素6 IDL> print,arr[1,1] 6

IDL> print,arr[4] 4

IDL> print,arr[6] 6

2.4,5多维下标的抽取

IDL> n = 5

IDL> arr = indgen(n,n) IDL> print,arr

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 IDL>

IDL> index = lindgen((n+1)/2)*2 IDL> print,index

0 2 4 IDL> print,arr[index] 0 2 4 IDL> print,arr[index,index] 0 12 24 IDL> sub = arr[*,index] IDL> print,sub

0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 IDL> sub = sub[index,*] IDL> print,sub

0 2 4 10 12 14 20 22 24

IDL> sub = (arr[*,index])[*,index] IDL> print,sub

0 1 2 3 4 20 21 22 23 24 20 21 22 23 24

本文来源:https://www.bwwdw.com/article/r8b8.html

Top