摘要: 创建数组的函数 零数组与索引数组 IDL的內建函数允许用户按给定的类型创建数组,同时数组中的每一个元素都被初始化为零,或被初始化为该元素在数组中的索引值(下标值),即元素在数组中的位置。例如, 创建一个六元素的零数组和索引数组: IDL>zeros=...
创建数组的函数
零数组与索引数组
IDL的內建函数允许用户按给定的类型创建数组,同时数组中的每一个元素都被初始化为零,或被初始化为该元素在数组中的索引值(下标值),即元素在数组中的位置。例如, 创建一个六元素的零数组和索引数组:
IDL>zeros=intarr(6) IDL>index=indgen(6) IDL>print,zeros,index 0 0 0 0 0 0 0 1 2 3 4 5
在索引数组中,元素的值按步长为1连续增长。在多维索引数组中,索引值按数组最左边的维度增长, 例如:
IDL> uu = indgen(15) IDL> xx = reform(uu, 5,3) IDL> print ,xx 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
同值数组
“replicate”函数将创建一个特定维度的数组,并将某个标量复制到该数组中:
Arr = replicate(2.0, 4, 2) Print, arr
创建多维数组
另外,“make_array”函数将创建一个特定维度的数据,该数组可以是零数组、索引数组或具有某个特定值的数组。为了创建这样一个零数组,其维度和类型表示如下:
IDL>zeroed=make_array(3,2,/byte) IDL>print,zeroed 0 0 0 0 0 0
创建多维索引数组,必须使用“index”关键字:
IDL>index=make_array(4,3,/float,/index) IDL>help,index INDEXFLOAT =Array[4,3] IDL>print,index 0.00000 1.00000 2.000003.00000 4.00000 5.00000 6.000007.00000 8.00000 9.00000 10.0000 11.0000
创建每个元素同值的数组,则需要使用“value”关键字:
IDL>arr=make_array(6,/long,value=32L) IDL>help,arr ARR LONG=Array[6] IDL>print,arr 32 32 32 32 32 32
如果在IDL程序运行之前用户并不知道数组的大小和类型,则此时“make_array()”函数尤为重要。
浮点网格数组
IDL中可以以任意步长创建精确而有效的一维网格数组。例如, 要求创建这样一个浮点数组:它的元素值从1000.0按步长0.1均匀的上升到1010.0。首先,数组首尾的值和数组的大小应定义为浮点变量:
IDL>x1=1000.0 IDL>x2=1010.0 IDL>dx=0.1
然后,数组元素的数目利用“floor”函数计算(为了避免舍入的误差,加上了1.0e-5):
IDL>nx=floor((x2-x1)/dx+1.0e-5)+1L IDL>help,nx NX LONG=101
下面计算网络数组的值。作为例子我们显示数组最后5个元素的值,并精确到小数点后4位:
IDL>arr=lindgen(nx)*dx+x1 IDL>help,arr ARR FLOAT =Array[101] IDL>print,arr[96:100],format='(5f11.4)' 1009.60001009.7000 1009.8000 1009.9000 1010.0000
网格数组不能通过累加来创建,因为累加所产生的舍入误差将会是数组元素的值越来越不精确:
IDL>arr=fltarr(nx) IDL>arr[0]=x1 IDL>for index=1,(nx-1) do arr[index]=arr[index-1]+dx IDL>print,arr[96:100],format='(5f11.4)' 1009.5977 1009.6976 1009.7976 1009.8976 1009.9976
除了不精确的问题,累加的方法使用了效率不高的循环过程来计算网格数组。