IDL教程 - 图文

更新时间:2024-05-23 18:07:01 阅读量: 综合文库 文档下载

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

p实验一 IDL的介绍和基础知识

目的:了解IDL的构成和基本框架体系;熟练掌握IDL的变量;掌

握IDL的命令书写及数据的输入输出

原理:标量,矢量,数组,结构体;命令书写规则;数据输入输出方法 软件:IDL 内容: 一、介绍IDL

IDL(Interactive Data Language)交互式数据语言是进行数据分析、可视化表现和应用开发的理想软件工具。作为面向矩阵、语法简单的第四代可视化语言。IDL的特性包括:高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速、量化可视化表现、集成数学与统计学算法、灵活的数据输入输出方式、跨平台图形用户界面工具包、连接ODBC兼容数据库及多种程序连接工具等。

IDL是完全面向矩阵的,相比常用语言它具有快速分析超大规模数据的能力,而相比于同样面向矩阵的其他软件,它又能够更容易实现图形对象的交互操作和图形、图像的高级处理。

IDL的用户群分布很广。它不但可以为科学研究人员提供交互式浏览和分析数据的环境,为程序员提供快速源程序开发及跨平台发布的高级编程语言,还可以为三维动画制作人员和三维地理信息系统应用人员提供良好的软件应用平台。

在国外IDL已经被列为大学的标准课程,其功能和应用效果完全

可以替代如Matlab等其他同类科学计算应用软件。在国内IDL要比国外稍微滞后,还处在推广和应用的初期。许多科研单位和一些大学在与国外单位交流中,特别是一些留学归国人员,是IDL在国内应用的先行者和忠实用户。随着IDL应用和市场的广泛进入和从科研院所的高端应用到更广泛地民用化的接受过程,越来越多的人将了解和接受应用IDL。

IDL给用户提供3种不同的工作方式:命令交互方式、程序执行方式和菜单操作方式。可以根据用户需要配合使用。 二、IDL命令书写规则:

命令动词[,参数1,?,参数n][,关键字1,?,关键字n] (1)每条命令必须以命令动词开始,动词后面的选择项可以必选或者可选。

(2)参数在命令动词的右边,一般有确定的顺序和确定的类型,一般是必选项。

(3)关键字在命令动词的右边,一般有确定的类型,但是顺序是任意的,而且一般为可选项。

(4)用逗号分隔每条命令中的各个选项。

(5)一条命令太长,一条写不下,用$在行尾进行分行,并在下一行继续写。

不分大小写(但是要有统一的习惯) 注释符“;” 续行符“$”

分隔符“,”

IDL> print,'hello',format='(5x,A5)' 三、IDL的基础知识 1、变量 (1)命名规则

变量名称的最大长度不超过255个字符,变量的首位只能是字母和下划线,中后部只能是字母、数字、下划线“_”和连接符“$”。如下正确:

reade6_$file only_8_bit ComputerType variables _day_of_year

如下错误:

name.last third%file 4th_list $temp

(2)创建变量

变量有两个重要属性:数据类型和组织结构。数据类型指出属于数据类型中的哪一种。在IDL中有14种基本数据类型。在图表1中可以看到每一种数据类型,每个类型创建的变量的字节大小、变量创

8位,建方式、数据类型之间强制转换的《256 IDL函数名称。除了数据类型外,

一个变量有一个组织结构。有效的组织结构有标量(例如单个数值)、

矢量(真正的一维数组)、数组(最高可达八维)和IDL结构体(能包含各种数据类型的变量和组织结构,结构中独立的组成部分称为字段)。

表1 : IDL中的14种基本数据类型 字节数据类型 数 thisVar=Byte(variabl字节型 16位有符号整2 型 32位有符号长4 整型 64位有符号整8 型 16位无符号整2 型 32位无符号长4 整型 64位无符号整8 型 浮点型 4 Var=0.0 Var=0ULL able) thisVar=Float(variabVar=0UL le) thisVar=Ulong64(variVar=0U e) thisVar=ULong(variabVar=0LL ble) thisVar=UInt(variablVar=0L e) thisVar=Long64(variaVar=0 ) thisVar=Long(variabl1 Var=0B e) thisVar=Fix(variable创建变量 数据类型强制转换函数 le) thisVar=Double(varia双精度浮点型 8 Var=0.0D ble) Var=Complex(0.0,0复数 8 .0) Var=Dcomplex(0.0D双精度复数 16 ,0.0D) 0-327Var=’’字符串 67 指针 对象

(3)IDL语言变量的特点及标量赋值

创建IDL变量不需要事先声明,是通过赋值形式进行定义的语言变量定义。并且变量随时可以进行数据类型和维数的动态改变。

IDL最强大的功能之一,就是大多数过程或函数都能在任何数据类型或组织结构上生效。这是因为IDL在运行时能改变变量的数据类型和组织结构(像世界上其他强大的事物一样,这种动态改变变量的属性的能力也有潜在的巨大危险!必须小心,确信知道正在使用哪种数据)。在IDL中,本质上讲变量是毫无意义的(像在Fortran或者C程序中),因为这种变量的数据类型很容易改变。例如:

4 4 Var=”” Var=Ptr_New() Var=Obj_New() ble) None None iable) 或thisVar=String(variaable) thisVar=DComplex(varthisVar=Complex(vari

IDL>num = 3 IDL>num = num*5.2 IDL>num = float(3)

变量num被初始化为一个整数,由于数学运算的结果和重新赋值,它被动态地改变成浮点数值。这是因为IDL在数学计算当中为了保证最高的精度,将低精度的数据类型提升为高精度的数据类型。当num被再赋值(在等号的左边),它被提升为一个浮点数去保持等号右边计算的精度。思考下面这个例子:

IDL>result=4*x‘保持高精度

在这种情形下,不可能知道变量会产生哪种数据类型和组织结构,因为对x变量一无所知。事实上,结果主要取决于变量x的数据类型和数据结构。如果x是10个元素的浮点矢量,结果将会是10个元素的浮点矢量。如果它是100 × 200的长整型数组,结果也将是100 ×200的长整型数组。注意,如果x有一个字节的数据类型,那么结果将是一个整型数据类型(在这种情形下,组织结构并没有多大影响)。这是由于和整数相乘的结果。

记住,等号右边的表达式总是在将数据类型和组织结构赋予等号左边的变量前计算的。IDL总是将变量提升到能保持表达式的计算精度的数据类型。

? 注意整型变量

关于整型变量有两种常见的错误。第一种涉及到整数数学操作。思考一下这个示例:

IDL>result=12/5

也许期望的是一个值为2.4浮点变量,但是结果却是一个值为2的整数。这是因为方程式右边的两个数字为整数。这是一个整数除法的例子。当然,找到这个问题的原因并不难,但有时由整型数据导致的问题会更微小,以致于难以发现。

例如: 假如想知道IDL图形窗口的比率。窗口的大小(像素点或整数值)被储存在两个系统变量中。会写出如下的IDL代码:

IDL>aspect=!D.X_Size / !D.Y_Size‘系统变量

它可能需要花掉很长的时间来找出为什么比率为零。正确的方法是写出一些代码以强制将一个整数值变成一个浮点,如下:

IDL>aspect=Float(!D.X_Size) / !D.Y_Size

现在的比率变量就是一个所期望的浮点数了

(4)IDL数组

IDL是一个擅长于处理矢量或数组数据的软件,所以有大量的IDL命令用于创建不同数据类型的矢量和数组。特别是,有许多用于创建各种数据类型数组的函数,这类函数创建的数组每个元素的初始值为零。还有许多用于创建各种数据类型数组的函数,这类函数创建的数组每个元素的初始值为其在数组中的索引位置。在表2中将看到这些函数的列表。

表2:IDL函数可以创建矢量和多维数组 数据类型 字节型 初始化函数 BytArr 产生索引值的函数 BIndGen 16位有符号整型 IntArr‘默认都为0 IndGen‘以下标值为初值 32位有符号长整LonArr 型 64位有符号整型 Lon64Arr 16位无符号整型 UIntArr 32位无符号长整ULonArr L64IndGen UIndGen ULIndGen LIndGen 型 64位无符号整型 ULon64Arr 浮点型 双精度浮点型 复数 双精度复数 字符串 指针 对象

例如,创建100×100初始值为零的字节型数组,输入:

IDL>array=BytArr(100,100)

创建一个有100个元素的浮点型矢量,初始数值为从0到99,输入:

IDL>vector=FIndGen(100) IDL>vector=FIndGen(10,10)

IDL语言数组的维数为:0~8维,数组的引用符号既可以用[],也可以用()但推荐习惯使用[]因为函数的引用采用(),故数组调用采用[]可以与此相区别,数组定义时不能指定下标的区间,只能从

FltArr DblArr ComplexArr DComplexArr StrArr PtrArr ObjArr UL64IndGen FIndGen DIndGen CIndGen DCIndGen SIndGen None None 0开始。

IDL>print,vector[0] IDL>print,vector[2]

IDL> print,vector[0:10] 返回前0-10共11个元素

? 多维数组:

IDL语言数组的维数为0~8维,当维数大于2的时候就是多维数组了。值得注意的是:数组下标的顺序先是列标,后是行标,这正好与已习惯的线性代数中的矩阵或行列式相反,在IDL矩阵变换函数中会有更详细的介绍。在对多维数组操作时,多维数组的数据空间顺序是否了解清楚,是数据读写准确的重要环节。

IDL>vector=FIndGen(10,20)

? 数组赋值基本包括三种模式

IDL对数组赋值是比较灵活的,基本包括三种模式: 1、定义数组之后,对元素进行赋值,如:

IDL>A=IndGen (3,3) IDL>A[1,2]=0

2、通过数组索引和矩阵(指标)运算来赋值:

IDL>A[1,*]=A[1,*]*3

数组下标中“*”代表该维的所有元素。下标运算也可通过“:”指定区间:

IDL>A[0:1,*]=A[0:1,*]*3

3、直接通过赋值来定义数组:

IDL>a=[[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]]

这个数组的结构为:Array[2, 2, 3]

? 用一维下标来存取数组

可以使用一维下标来存取数组中的每一个元素。要知道数组元素是以行顺序存储的,例如要获得数组中的第四个元素,可以键入以下语句来存取:

IDL>A=IndGen (3,3) IDL>Print, A[3]

这样就可以打印出数组A的第4个元素,要注意IDL中数组是按

行存储。用一维下标可以存取多维数组中的元素,这是IDL语言的一个强大的工具。也可以用一维向量来做数组的下标。例如,倘若要存取数组中的第一,二,四和第六个元素,可键入:

IDL>indices=[0,1,3,5]

IDL>Print, A[indices]

(5)系统变量

IDL有一类特殊的预定义系统变量,系统变量通常是以“!”开头的,在这里我们只介绍几组常用的系统变量,在直接图形法(图形只可输出,不能进行交互操作)输出中会常用到。

? !d 系统变量

提供当前显示设备的信息,此类系统变量包含如下系统变量:

系统变量名 !d.name !d.n_colors 变量描述 当前图形设备的名称 当前图形设备使用的颜色数 !d.table_size 当前分配的颜色表索引数 !d.x_size !d.y_size !d.window 当前图形窗口的宽(象素) 当前图形窗口的高(象素) 当前图形窗口的索引号(没创建和打开图形窗口,值为﹣1)

? !p系统变量;

更改默认的画图设置,此类系统变量包含如下系统变量:

系统变量名 !p.color 画图的颜色索引 变量描述 !p.charsize 标签的字符大小 !p.linestyle 画线时的线性 !p.multi 指定在一个页面上画图的个数 !p.position 指定在一个页面上画图的位置 !p.psym 在画图时所用的符号样式 !p.subtitle 副标题(显示在x轴下) !p.title

? !x,!y,!z系统变量

更改在画图上坐标轴的默认属性,此类系统变量包含如下系统变量(如前述系统变量,在前面加!x,!y,!z):

系统变量名 minor range 变量描述 在坐标轴上要显示的刻度数 设置坐标轴上显示数值的范围 画图的标题 tickbane ticks title

(6)结构体

为每个主刻度设置一个注记数组(一般是字符串) 坐标轴上显示的刻度段数 坐标轴的标题 结构是标量、数组,以及结构本身的集合,不同数据类型的变量可以用结构来存储。结构的基本形式是:StrName={name,Var_name1: Var_Def1,?, Var_nameN: Var_DefN}。Var_namei为结构成员名称,Var_Def1 为该成员的定义。Name存在,则该结构为命名结构,否则为模糊结构。命名结构在运行过程中不可以改变结构,但模糊结构可以。结构的引用为StrName.Var_name1 或 Name.Var_name1。结构可以继承(但不传递初始值):

匿名结构体

IDL>person={name:’li’,number:4567} IDL> print,person IDL> help,person

IDL> help,person,/structure 获取结构体变量 IDL> print,person.name IDL> print,person.(1) 调整结构体变量

IDL> person.name='wang' IDL> print,person

结构体的变量类型不能改变

IDL> person.number=float(person.number) IDL> help,person,/structure 创建结构体数组

IDL> se=replicate(person,10)

IDL> print,se se是10个personal 署名结构体

IDL> dot={pixel,x:128,y:236,color:byte(3)} IDL> help,dot,/structure 新的署名结构体

IDL> point1={pixel} ‘引用 IDL> help,point1,/structure

** Structure PIXEL, 3 tags, length=6, data length=5: X INT 0 Y INT 0 COLOR BYTE 0 IDL> point2={pixel,45,78,127} IDL> help,point2,/structure

** Structure PIXEL, 3 tags, length=6, data length=5: X INT 45

Y INT 78 COLOR BYTE 127

2、数组性质

当需要获取关于数组性质的一些函数时,如数组元素数目,数组大小和类型,平均值等,需要用到如下函数:

数组元素的数目n_elements(), 数组大小和类型 size(), 最小值 min(), 最大值max(), 平均值mean(), 方差variance(), 标准差stddev(), 总和total()

注:重点掌握size()函数 IDL> arr=findgen(256,256)

IDL> print,n_elements(arr) 返回元素个数

IDL> print,size(arr)

2 256 256 4 65536 IDL> print,size(arr,/n_dimensions) 返回是几维数组 2

IDL> print,size(arr,/dimensions) 256 256 IDL> print,size(arr,/type) 4

IDL> print,size(arr,/tname)

这种类型占几个字节 FLOAT

DL> print,size(arr,/n_elements) 65536 类型代码

3、数组元素的定位 IDL> arr=indgen(10)*10 IDL> print,arr

0 10 20 30 40 50 70 80 90

IDL> index=where(arr gt 35) ;EQ, NE, GE, GT, LE, LTIDL> print,index

大于 60 4 5 6 7 8 9

(注意index是什么变量) IDL> print,arr(index)

40 50 60 70 80 90 IDL> print,arr(index[0]) 40

4、简单数组函数: ? Reform()函数

Reform()函数可以使数组在固定元素个数的前提下,改变下标引用索引。显然Reform()函数可以改变数组的维数,例如:

IDL>a = Intarr(10,10,10)

IDL>c = Reform(a,200,5) (与下等价) IDL>d = Reform(a,[200,5]) (与上等价)

IDL>e = Reform(a,[200,50]) (元素个数增多,错误) IDL>e = Reform(a,[20,5]) (元素个数减少,错误)

Reform()函数将在以下方面产生很好的应用效果;

1、简化数组调用;

2、进行数组索引动态调整,以便不同模式下的引用。

? 数组重排列函数 1、改变数组维数

IDL> arr=[0,20,40,60,80,100] IDL> arr=reform(arr,3,2) IDL> print,arr

0 20 40 60 80 100 2、转换元素顺序 IDL> arr=indgen(5) IDL> print,arr

0 1 2 IDL> print,reverse(arr) Compiled module: REVERSE.

4 3 2 IDL> arr=indgen(3,3) IDL> print,arr

0 1 2 3 4 5 6 7 8 IDL> print,reverse(arr) 2 1 0

3 4 1 0 5 4 3 8 7 6 IDL> print,reverse(arr,1) 2 1 0 5 4 3 8 7 6 IDL> print,reverse(arr,2) 6 7 8 3 4 5 0 1 2

注意reverse函数中1,2两个参数意味着什么 3、旋转数组 IDL> arr=indgen(4,3) IDL> print,arr

0 1 2 3 4 5 6 7 8 9 10 11 IDL> print,rotate(arr,1) 8 4 0 9 5 1 10 6 2 11 7 3

IDL> print,rotate(arr,2)

11 10 9 8 7 6 5 4 3 2 1 0 IDL> print,rotate(arr,3) 3 7 11 2 6 10 1 5 9 0 4 8

注意rotate函数中1,2,3三个参数意味着什么 4、转置数组Transpose IDL> arr=indgen(4,3) IDL> print,arr

0 1 2 3 4 5 6 7 8 9 10 11 IDL> print,transpose (arr) 5、练习

练习1:分别建立字节型变量,16位有符号整型变量,浮点型变量,

字符串。用HELP函数查看变量的属性。将字符串转变为字节型变量,将整型转换为字节型变量。

练习2:IDL>num = 3 ; num是一个整型变量

IDL>num = num*5.2 ; num变为一个浮点型变量 如何使num在上式计算完毕后仍为整型变量。

练习3:创建100×100初始值为零的浮点型数组

练习4:创建一个有100个元素的字节型矢量,初始数值为从0到99。

思考元素个数超过256个时会有何变化。

练习5:vector=FIndGen(10,10),print该变量第二行的前5个元素。 练习6:(1)建立一个3列4行的浮点型数组,并将数组中的元素赋值如下:

1.00000 2.00000 3.00000 2.00000 4.00000 6.00000 3.00000 4.00000 5.00000 1.00000 8.00000 27.0000

注,通过数组索引和矩阵运算来赋值 (2)print出该数组中蓝色字体的元素。

(3)用reform函数将上述数组变为一个1行的数组

练习7:以student为名建立一个匿名结构体,结构体中包含两个变量,

第一个变量为name,是一个1列3行的字符串矩阵,第二个变量为num,是一个1列3行的浮点型矩阵。接下来定义name为你的3个同学的名字,num为他们相应的电话号。查看你创建的结构体是否正确。

练习8:建立一个数组,计算数组最大值,最小值,平均值

练习9:如果想用size函数返回一个变量,如:a=size(arr),那么思考

一下a的数据类型是什么?

(四)数据的输入与输出

在使用IDL处理数据时,经常需要输入一些数据,而且常常需要把处理后的数据输出。这就需要我们了解数据的标准输入、输出方法和数据的格式输入输出方法。 1、

输入输出格式代码

输入格式:READ, 变量1, …, 变量n, FORMAT=’(格式描述)’[,PROMPT=’提示信息’]

输出格式:PRINT, 表达式1, …, 表达式n, FORMAT=’(格式描述)’ 例子:

IDL>year=0 & month=0 & day=0 IDL>READ,year,month,day,PROMPT=’日’,FORMAT=’(I4,I2,I2)’

IDL>PRINT,year,month,day,FORMAT=’(I4,”/”,I2,”/”,I2)’ ;输出2010/05/19

表1 IDL6.3的输入输出格式代码 格 式 代 码 格 式 含 义 请

[n]A[w] 读几次 读几位 输入w个字符(重复n次)若省略w,输出字符串中所有字符 若没有有效的变量,则终止输入输出 : $ 使用下一个输出数据输出到该输出数据所在行的后面(仅用于输出) [n]I[w]or[n]I[w.m] 输出w位十进制整数(其中在最右面的m位中的空格位置以0填充) [n]O[w]or[n]O[w.m] 输出w位八进制整数(其中在最右面的m位中的空格位置以0填充) [n]Z[w]or[n]Z[w.m] 输出w位十六进制整数(其中在最右面的m位中的空格位置以0填充) [n]F[w.d] 输出w位单精度浮点数(其中小数位d位) [n]D[w.d] 输出w位双精度浮点数(其中小数位d位) [n]E[w.d]or[n]E[w.dEe] 以指数形式(科学格式)输出w位浮点数(其中小数位d位,指数位e位) [n]G[w.d]or[n]G[w.dEe] 根据数据大小自动选择科学格式或者F,D格式输出 Tn 在当前行的第n列(约对位置)输出变量的值 TLn 从当前位置向左移动n列,然后输出变量的值 TRn or nX 从当前位置向右移动n列,然后输出变量的值 / 2、文件操作

Openr 打开一个存在的文件并用于只读

Openw 打开一个用于读写的文件,---存不存在都可以 Openu 打开一个存在的文件并用于读写 Findfile() 返回当前文件夹中的文件名 Dialog_pickfile() 图形文件选择器,-----对话框 Fstat() 返回一个已打开文件的信息 Eof()检测文件尾 Close 关闭文件

Free_lun释放逻辑设备号并关闭文件 打开文件

换行输出

注意:逻辑设备号是IDL6.3允许使用的逻辑设备的编号。由于文件的读写操作是通过与该文件相关联的逻辑设备号来对该文件进行读写的,所以在对文件读写时,必须先打开文件,并且赋予以一个逻辑设备号。IDL6.3允许使用的逻辑设备号的范围为-2,-1,0,…,128;其中-2,-1,0分别用于标准错误、标准输出和标准输入;1~99为用户可以使用的逻辑设备号;100~128为使用关键字/GET_LUN时,系统自动分配给文件的逻辑设备号。

每一个打开过程都需要以一个逻辑设备号来引用文件。逻辑设备号是一个长整型标量,可以设置为1—99 IDL> lun=20l

IDL> openw,lun,'test.dat'

但是,更好的方法是通过可选关键字get_lun来赋予自由逻辑设备号,自由逻辑设备号为100—128 IDL> openw,lun,'test.dat',/get_lun 关闭文件 IDL> lun=20l IDL> openw,lun,'test.dat' IDL> close,lun

IDL>openw,lun,'test.dat',/get_lun IDL> free_lun,lun

字母L

IDL> close,/all 选择文件

findfile()函数返回一个字符串数组 IDL> list=findfile() IDL> print,list 过滤数据

IDL> list=findfile('*.dat') 图形文件选择器

IDL> file=dialog_pickfile()

IDL> file=dialog_pickfile(filter='*.dat')

获取文件信息

IDL> file=filepath('hurric.dat',subdir='examples\\data') IDL> openr,lun,file,/get_lun IDL>info=fstat(lun)

文件分配设备号 IDL> help,info.size,info.read,info.name

LONG = 149600 BYTE = 1

STRING

'C:\\RSI\\IDL63\\examples\\data\\hurric.dat'

=

IDL> free_lun,lun

3、读写有格式(ASCII)文件 Readf 读文件 Printf 写文件

IDL> file=dialog_pickfile() IDL> openr,lun,file,/get_lun 用动态分配数组的方式初始化一个矢量,一列15行 打开后能看IDL> data=make_array(1,15,/string) IDL> readf,lun,data IDL> print,data IDL> close,/all

-156.9500, 20.7833, 399, 68, 64, 10, 60 -116.9667, 33.9333, 692, 77, 50, 8, 270 -104.2545, 32.3340, 1003, 87, 50, 10, 340 -114.5225, 37.6073, 1333, 66, 35, 0, 0 -106.9418, 47.3222, 811, 68, 57, 8, 140 -94.7500, 31.2335, 90, 89, 73, 10, 250 -73.6063, 43.3362, 100, 75, 64, 3, 180 -117.1765, 32.7335, 4, 64, 62, 5, 200 -116.0930, 44.8833, 1530, 55, 51, 0, 0 -106.3722, 31.8067, 1206, 82, 57, 9, 10 -93.2237, 30.1215, 4, 87, 77, 7, 260

读到data中 -109.6347, 32.8543, 968, 80, 46, 0, 0 -76.0225, 43.9867, 99, 75, 66, 7, 190 -93.1535, 36.2597, 415, 86, 71, 10, 310 -118.7213, 34.7395, 1378, 71, 46, 5, 200

IDL> data=lindgen(10,100) IDL> file=dialog_pickfile() IDL> openw,lun,file,/get_lun IDL> printf,lun,data IDL> close,/all

4、读写无格式文件 读readu 写writeu

IDL> file=filepath('ctscan.dat',subdir='examples\\data') 找到文件位置 主路径:安装路径

IDL> openr,lun,file,/get_lun 只读

IDL> data=bytarr(256,256) 定义一个变量,是一个数组

IDL> readu,lun,data 读到data IDL> tv,data IDL> close,/all

练习10:将data变量存储为一个无格式的数据文件。 IDL> data=dist(256)

Compiled module: DIST. IDL> file=dialog_pickfile() IDL> openw,lun,file,/get_lun IDL> writeu,lun,data IDL> close,/all

给一个无格式数据加头文件 IDL> info=size(data) IDL> print,info

2 256 256 4 65536

IDL> openw,lun,file,/get_lun IDL> info_size=n_elements(info) IDL> print,info_size 5

IDL> header=[info_size,info] IDL> printf,lun,header

IDL> writeu,lun,data 区别在于printf能看到,不乱码 IDL> free_lun,lun

练习11:读取上述文件中的头文件信息,用头文件中的信息来读取文件中的数据,并将该数据赋值给一个变量,显示该变量。

实验二:IDL绘图

目的:掌握IDL绘制线画图的方法;掌握IDL绘制曲面图和等值线的方法。

原理:PLOT、OPLOT、Surface、Shade_surf、Contour的使用规则 软件:IDL 内容: (一) 1、

绘制线画图 创建线画图

生成线画图最简单的方法是绘出一个矢量。可以用LoadData命令打开时序数据集。它用来装载IDL的例程中所需的数据。打开并编译LoadData程序,键入如下语句以查看所能使用的数据集: IDL>curve=LoadData()

另外一种选择第一个数据集的方法是,按如下方法使用LoadData:

IDL>curve=LoadData(1)

要查看curve变量如何被定义,键入: IDL>Help, curve

CURVE FLOAT =Array[101]

将发现curve是一个具有101个元素的浮点矢量(或一维数组)。 要绘出该矢量,可键入: IDL>Plot, curve

IDL试图用少量的信息尽可能地绘出漂亮的线画图。在这种情况下,x轴或水平轴被标识为从0到100,这与矢量中的元素个数相对应。而y轴或垂直轴则是用数据坐标来标识(它是取决于数据的坐标轴)。

但大多数情况下,线画图用于显示一组数据(独立数据)相对另外一组数据(非独立数据)的关系。例如,上面的曲线可能代表在某段时间内采集数据的信号。可能需要绘制某个时刻的信号值。在这种情况下,需要一条与该曲线矢量具有相同元素个数的矢量(这样可以获得一一对应的相关性),并将该矢量转换为实验中所用的时间单位。例如,可以创建一个时间矢量,并绘出它与上述曲线矢量的关系图: IDL>time=FIndGen(101)*(6.0/100) IDL>Plot, time, curve

FIndGen命令创建一个元素值为0到100的共101个元素的矢量。

乘法因子按比例缩小每个元素的大小,最后的结果是一个元素值为0到6之间的共101个元素的矢量。图形输出结果:

独立数据(时间)与非独立数据(曲线)关系图

注意,在此图中的坐标轴上没有相应的标题。在图上设置标题是很容易的,只要用XTitle和YTitle关键字即可实现。例如,为此曲线图加标题,可键入:

IDL>Plot, time, curve, XTitle='Time Axis', $ YTitle='Signal Strength'

甚至可以用Title关键字对整个图形设置标题,键入: IDL>Plot,time,curve,XTitle='Time Axis',$

YTitle='Signal Strengh',Title='Experiment 35M'

输出结果:

简单的带坐标轴标题和图形标题的线

画图

注意,图形显示可以根据需要改成在白色背景下的黑线图,而上图显示为在黑色背景下的白线。将系统变量的背景与前景色更改即可。

IDL> !P.BACKGROUND='FFFFFF'XL IDL> !P.COLOR='000000'XL IDL>plot,time,curve

注意,图形标题稍微大于坐标轴的标题。事实上,是1.25倍的关系。可以用CharSize关键字改变所有图形注记的大小。例如,可以将坐标轴标题的字符放大50%:

IDL>Plot, time, curve, XTitle='Time Axis',$

YTitle='Signal Strength', Title='Experiment 35M', $ CharSize=1.5

甚至可以用[XYZ]CharSize关键字单独改变每个轴的标识字符的大小。例如,如果想使Y轴的注记比X轴的大两倍,则可键入: IDL>Plot,time,curve,XTitle='Time Axis',XCharSize=1.0,$ YTitle='Signal Strength',YCharSize=2.0 2、

定制线画图

上面是简单的线画图,除了数据本身外,没有很多其他信息。然而,有许多方法可用来定制和标注线画图。Plot函数可以被50多种不同的关键字修饰。

1. 改变线型或粗细;

2. 使用符号,符号之间可以有线条和没有线条存在; 3. 改变刻度标记的长度或刻度标记之间的间隔; 4. 改变绘图范围来绘出感兴趣的数据段; 5. 删除坐标轴或改变绘图方式。 改变线条的线型和粗细

例如,想用不同的线型画出数据。如画一条线型为长虚线的线条,可以这样实现:

IDL>Plot, time, curve,

LineStyle=5 !P.BACKGROUND='FFFFFF'XL !P.COLOR='000000'XL Plot, time, curve

对于线画图来说,可通过LineStyle关键字选用下表中列出的索

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

Top