1.2.1 wave
wave是Igor的核心概念。wave是一组数据,有点类似于数组。一个wave通常包含成百上千个数据,这些数据一般来源于数据采集设备。也可以主动创建具有特定目的和功能的wave。
除了存放实验数据之外,Igor中很多功能的实现需要wave,如列表框使用一个text wave存放列表项,配色表使用一个N×3的wave存放颜色信息。
wave具有坐标属性,即每一个数据都对应一个坐标。一维wave具有x 坐标,二维wave具有x和y 坐标,三维wave具有x、y和z坐标。在Igor中利用X-scailing来描述这一性质,坐标轴数据间隔可由用户设定或者采用默认值。一般在创建一个wave后都要设置X-scailing。图1-8显示了一维wave的基本结构。
图1-8 一维wave的基本结构(X scailing表示x坐标)
在实际中有时用另一个wave中的内容作为x坐标,即每一个数据点对应的x坐标存放于另一个wave相同的对应位置,这种类型的数据叫作XY数据,一个wave作为Y,另一个作为X。Igor支持XY型的数据处理。
wave被显示时,自动显示x坐标,如图1-8所示。利用Edit命令查看wave内容时,不显示x坐标信息。如果同时查看x 坐标信息,应该在wave名字后面加“.xy”,如图1-9所示。
图1-9 在表格中显示wave的x坐标
Make/O/N=100 data
SetScale/I x,0,1, data
data=x
Edit data //只显示data内容
Edit data.xy //显示data内容和x坐标信息
Igor最多支持四维wave。创建wave的主要方法是使用Make命令。在创建时可以指定wave内容的数据类型,是数值型还是字符串型wave。如果是数值型,还可以更进一步指定数值的类型,是整型还是浮点型,是Byte还是Word等。下面介绍wave的创建方法。
1.菜单项【Data】|【Make Waves】创建wave
这种方法非常简单,如图1-10所示。
图1-10 利用对话框创建wave
这种方法可以同时创建8个wave,创建的wave初始值都被赋值为0。可在【Type】下拉列表中指定数据类型。在实际中很少用这种方法创建wave,这个窗口更多地被用来帮助用户理解和掌握Make命令的使用。
2.Make命令创建wave
Make命令用于创建wave,是Igor最常用命令之一。利用菜单【Data】|【Make Waves】打开的窗口所进行的操作,最终转化为Make命令的调用。下面创建一个wave,名为sinx,数据个数为200, x轴坐标范围为0到2π,命令如下:
Make/O/N=200 sinx; SetScale/I x,0,2∗pi, sinx; sinx=sin(x); Display sinx;
标记/N指明了数据点个数,不指定则取默认数据个数(128)。标记/O表示如果wave已经存在则覆盖。sinx为创建的wave的名称。
SetScale命令用来设置sinx的x轴坐标,标记/I表示设定起始和终止坐标(inclusive),在本例中,第一个数据点对应的x坐标为0,最后一个数据点对应的x坐标为2π,相邻数据间x坐标间隔为(2π)/(200-1)。
赋值过程调用了Igor提供的内置正弦函数为sinx赋值,注意正弦函数sin(v)的每一个参数都来源于sinx对应位置的x坐标值。
命令Display sinx将sinx绘制于一个窗口。
命令后边的分号不是必须的。将上面的命令直接复制到命令行窗口并按Enter键即可完成wave的创建和显示。命令执行完毕,当前数据文件夹下会出现一个名为sinx的wave。本例中,当前数据文件夹为root,如图1-11所示。
图1-11 创建的wave自动出现在数据浏览器当前数据文件夹下
也可以利用Make创建复数wave、文本wave,前者使用标记/C,后者使用标记/T。指定创建wave的完整路径在相应的目录下创建wave,这种方法可以突破只能在当前数据文件夹目录下创建wave的限制,如:
Make/O/N=200/C cmpwave; Make/O/T/N=200 twave; SetDataFolder root; //设定当前目录 NewDataFolder tmp; //创建一个名为tmp的目录 Make/O/N=200 root:tmp:cmpwave; //指定wave的完整路径
可以利用/D、/B、/I等标记指定wave的数据类型为双精度浮点型、字节型和整型等。
创建wave后要设置x坐标,该操作通过SetScale命令来完成,命令中利用/I标记指定起始和终点x坐标。也可以利用/P标记指定起始坐标和坐标间隔,如:
SetScale/P x,0,2∗pi/199, "s", sinx SetScale/I x,0,2∗pi, "s", sinx
上面两条命令效果是等价的。注意“s”表示设定坐标的单位为“s”。
SetScale命令中,x代表x坐标轴方向(维度1);与之类似的,y、z和t分别代表y坐标轴、z坐标轴和t坐标轴方向,分别对应wave的第2、3、4维度。
3.表格创建wave
如果wave的数据个数不太多,可以通过表格中输入数据来创建wave。执行菜单【Window】|【New Table】命令打开一个新的表格。也可以在命令行窗口直接输入Edit命令打开一个新的表格。二者本质上是等价的,前者正是调用了Edit命令,如图1-12所示。
图1-12 Edit命令打开一个数据表格(Table0)
表格默认只有左上角第一个空格可编辑,输入数字(字符)后该列下一个空格自动变为可编辑状态。
输入数据后Igor会自动在当前数据文件目录下创建一个wave以存放输入的数据,wave的长度就是该列输入数据的个数,wave名默认为waveX, X的大小取决于当前目录中名字具有waveX形式的wave的个数。如果当前目录下没有waveX型名字的数据,则wave的名字为wave0,如果已经存在一个wave0,则名字自动命名为wave1。可以修改默认的数据名,方法是右击wave0所在列,在弹出的快捷菜单里选择【Rename wave0】命令,在随后的对话框中输入新的名字,单击【Do It】按钮,如图1-13所示。
图1-13 在数据表格中修改wave名字
也可以在数据浏览器中单击wave的名字,待名字区域变为可编辑状态后直接修改,如图1-14所示。在程序中还可以利用Rename、Movewave等命令修改wave的名字。上面的对话框操作正是调用了Rename命令。
图1-14 在数据浏览器中修改wave名字
4.外部文件导入创建wave
对于规则分布的数据,如存放于文本文件中的利用Tab键或者逗号等分隔的多列数据,可以直接通过复制的方式复制到Igor的表格里,Igor会自动创建wave,并命名为waveX,存放在当前数据文件夹目录下,X取决于当前目录下名字为waveX形式的wave的数量。
Excel表格中的数据可以直接复制粘贴到Igor的表格中。对于存放于文件中的数据,可以利用菜单【Data】|【Load Waves】读取。该菜单列出了Igor能加载的数据类型,命令基本分为两类:一类用于读取由Igor保存的数据文件,如【Load Igor Binary】【Load Igor Text】;另一类用于读取非Igor保存的数据文件,如Excel文件、Image文件、普通文本文件、二进制文件等。对于前者,可以直接读取。对于后者,能否成功读取,取决于文件中数据的存放格式。一般对于标准的Excel数据(只包含数据列)和Igor自己保存的数据读取时没有任何问题,但是对于其他的数据则不能保证总是正确读取。
最常见的数据读取是从记事本中读取数据,此时可以使用命令【Data】|【Load Waves】|【Load General Text】。图1-15所示的记事本记录了牛顿环实验的测量数据,这是一个由Tab键分隔的数据列,在文件开头有一些文本信息,Igor会直接忽略这些文本信息。读取过程如图1-16所示。
图1-15 牛顿环实验数据
图1-16 从记事本中读取tab分隔的数据列
读取的wave自动命名为wave1、wave2。在这里可以按照前面的方法将wave名字修改为特定的名字。
从本例可以看出Igor之所以能顺利读取数据,是因为数据的存放是有规律的,即两列数据由Tab键分隔。对于没有任何规律的数据,Igor一般是无法直接读取的。
虽然【Load Waves】在对话框中提供了很多的设置以尽可能地适应不同的数据存放格式,但是能直接读取的数据文件种类仍然非常有限。对于不能直接读取的数据,最好的办法莫过于直接手动输入,或者利用文件读写函数和命令通过编写程序读入Igor。
对于一般的二进制数据文件,除了已经规范和标准化的数据格式(如JPEG、MP3等),【Load Waves】菜单命令基本上是无能为力的,此时必须用文件读写函数手动读取。绝大多数仪器测量的数据都需要通过这种方法进行加载。
5.利用Duplicate命令
复制是通过已有wave创建新wave最快捷的方法。Duplicate命令除了复制数据之外,还复制坐标信息,这在创建wave,特别是在程序中创建wave时会非常方便。Duplicate的使用非常简单:
Dupl icate/O oldwave, newwave;
其中,标记/O表示如果已经存在一个名为newwave的wave,则覆盖。还可以指定要复制wave的范围,比如要复制x坐标范围为从x=x1到x=x2的部分数据,则命令行如下:
Dupl icate/O/R=(x1, x2)oldwave, newwave;
也可以复制数据点p1到p2范围内的数据,命令如下:
Dupl icate/O/R=[p1, p2]oldwave, newwave;
6.wave赋值
一般有以下几种赋值方式,第1种是在创建时赋值,如
Make/O data={1,2,3}
第2种是通过元素序号赋值,元素序号位于方括号内,如
w[1]=2
使用方括号赋值是最基本的方式。Igor支持灵活多样的赋值方式,不仅支持方括号赋值,还支持圆括号赋值,甚至支持分段赋值:
w[2,10]=2 //给第2 到第 10 个元素赋值 w[0,98;2]=1 //给 0 到98 之间的偶数序号元素赋值(每隔2) w[1,99;2]=0 //给 1 到99 之间的奇数序号元素赋值(每隔2) w[,50]=2 //给第 0 到50 个元素赋值 w[51, ]=2 //给第51 及所有以后的元素赋值 w[, ;2]=2 //给所有偶数序号元素赋值(每隔2) w[1, ∗;2]=2 //给所有奇数序号元素赋值(每隔2) w(2)=2 //给x坐标值为2 的元素赋值 w(1,5)=2 //给x坐标位于(1,5)区间的元素赋值 w(0,100;5)=2 //给x坐标位于(0,100)区间的元素赋值,每隔5 赋值一次
第3种是通过表格赋值。
第4种是利用特殊函数如x、y、p、q等赋值,第4种赋值方式更灵活,更普遍,读者应该细心体会并掌握。
Make/O data SetScale/P x,0,0.001, data data=exp(-x/0.01) Make/O data1 data1=data[p] make/O/N=(100,100)data2 data2=y∗q
在上面的例子中,赋值号右边的x函数会自动获取data的x坐标值并传递给函数exp,而p函数则会自动获取data1的行序号并被data使用以获取该序号处data的值。y和q函数分别对应y坐标值和列序号,除此之外含义和x、p完全相同。如果程序里定义了名为x和y等变量,上述函数就被覆盖了。因此一般不要在程序里定义x、y、p、q等这样的变量。