第3章 数据分析处理 本章包含22个案例,介绍利用Igor进行数据分析和处理的程序设计技巧。内容涵盖: ①数据分析处理中wave操作的程序设计; ②特定领域里典型数据处理分析的程序设计。 数据分析处理程序设计一般包括数据拟合、算法设计、数据管理、数据可视化等操作,个别情况下还需要考虑程序运行效率。程序形式既有命令行程序,也有图形界面程序,具有较强的综合性,对程序设计者的要求是比较高的。 一般而言,好的数据分析处理程序应有以下特点: ①函数功能明确,一个函数只解决一个问题; ②同一个功能尽可能封装成为一个函数,在程序里需要该功能时调用该函数,而不是再将所有的代码复制一遍; ③尽可能不要在完成运算功能的函数里进行图形显示或者创建数据文件夹等操作。 案例43对wave的基本操作 1. 应用情景 对wave的基本操作包括获取wave名字、赋值、设置坐标、获取坐标信息、显示、显示设置等。 2. 程序代码 //****************************************************** //1. 对wave的基本操作 //****************************************************** Function WaveOPDaemon() //创建wave Make/O ddd //设置wave坐标 SetScale/P x,0,1,"s",ddd//设置横坐标 SetScale d,0,0,"m",ddd //设置数据单位 SetDimLabel 0,1,Row1,ddd//设置行名 //赋值 ddd=sin(x) //操作 Printf "sum:%f\r", sum(ddd) //求所有数据和 Printf "area:%f\r" area(ddd) //求曲线包围面积 Printf "average:%f\r" sum(ddd)/numpnts(ddd) //求平均值 Printf "ddd[20]:%f\r" ddd[20] //显示第21个数据(从0开始计数) Printf "ddd[Row1]:%f\r" ddd[%Row1] //显示行名为Row1所在行数据 Duplicate/O ddd ddd1 //复制数据 ddd1=ddd+cos(x) //对ddd1利用ddd进行赋值 Edit ddd //用表格显示数据 Edit ddd.xy //用表格显示数据及其x坐标值 Edit ddd.x //用表格显示x坐标值 Edit ddd.ld //用表格显示数据和行名 Edit ddd.l //用表格显示行名 Display ddd,ddd1 //显示曲线 ModifyGraph mode(ddd)=3,marker(ddd1)=8 //获取数据信息 Printf "Size:%d\r" numpnts(ddd)  //获取数据点数 Printf "x0:%f\r" leftx(ddd) //获取第一个数据点x坐标值 Printf "x0:%f\r" DimOffset(ddd,0) //获取第一个数据点x坐标值 Printf "Size:%d\r" DimSize(ddd,0)  //获取数据点数 Printf "delta x:%f\r" DimDelta(ddd,0) //获取x坐标间隔 Print NameofWave(ddd) //获取wave名字 End 3. 程序分析 Make命令创建wave,SetScale命令设置wave的坐标,标记/I指定wave首末数据点对应的坐标值,其他点的坐标值自动计算(均匀分布),也可使用标记/P,对应的命令如下: SetScale/P x,x0,dx,ddd 其中: x0表示第一个数据点对应的坐标值; dx表示坐标间隔。 SetScale d,0,0,"m",ddd中的d表示设定数据的单位为m。 SetDimLabel 0,1,Row1,ddd设置行名为Row1。0表示设置行名,1表示设置行名的行是第1行。SetDimLabel也可以设置列名。关于SetDimLabel的详细使用请查看帮助文件。 ddd=sin(x)利用x函数对wave进行赋值。整个赋值过程是自动的: 先取出某个数据点,计算该点的x坐标值,利用sin函数计算该坐标值的正弦值,将值赋值给该数据点,再循环对下个数据点进行赋值。因此这条命令在Igor内部是一个循环过程。上面的赋值过程可以利用循环改写如下: Variable i,n=numpnts(ddd) Variable x0=leftx(ddd) Variable dx=deltax(ddd) Variable xx for(i=0;i=ny) continue endif MatrixOP/O out=col(w,i+j) w1=w1+out k+=1 endfor w1=w1/k endfor if(dim==1) Matrixtranspose w endif if(!ParamIsDefault (x1)) KillWaves/Z tmp,out endif SetDataFolder curr s1=s1[0,strlen(s1)-2] return s1 End 3. 程序分析 本程序参数较多,有3个输入参数,9个可选参数。 参数w表示要抽取曲线的二维wave; nb表示积分参数(即相邻多少条曲线数据加在一起); dim表示抽取曲线的方向,dim取0时沿x方向抽取曲线,取1时沿y方向抽取曲线。 可选参数p0、dp和p1表示抽取曲线的范围,即从第p0条开始每隔dp条抽取一条曲线,一直到p1为止; x1和x2的含义一样,只是表示坐标而不是曲线次序; 如果不提供这些参数则抽取范围默认为整个wave,间隔为1或者最小坐标间隔。 df是文件夹名字,表示新创建的曲线将存放在此文件夹内,如果不提供则存放在当前文件夹,factor是采样因子。 程序虽然较长,但是原理并不复杂,基本思路是利用MatrixOP命令循环取出每一条曲线,再利用一个循环将相邻的nb条曲线和该曲线数据加在一起。当dim等于1时程序先利用MatrixTranspose命令交换w的行和列,然后再执行下面的操作。 程序里调用了案例44 GetDimInfo函数获取w的坐标信息。 4. 实战应用 假设被操作的二维wave为Bi2212,且位于当前目录下。打开程序窗口,输入下面的程序: Function Exp21() Wave w=Bi2212 String s0=GetTraces(w,10,0) Print s0 Wave EDC1=$StringFromList(0,s0) Display EDC1 End 程序按照默认方式调用GetTraces函数,从第0条EDC开始,抽取所有EDC,每条EDC都是相邻10条EDC叠加在一起的结果。生成的所有EDC位于当前数据文件夹目录下。程序打印了每条EDC的名字,并显示第一条EDC。程序执行结果如图35所示。