美文网首页高效率办公&科研
利用MATLAB批量完成科研数据处理

利用MATLAB批量完成科研数据处理

作者: yetwanng | 来源:发表于2017-11-20 20:39 被阅读27次

    利用常用软件批量完成科研数据处理

    tags:

    • MATLAB
    • 科研软件

    相信平时大家都有这种时候,测了一大堆数据,也知道该怎么去处理,但是样品很多,数据量很大,然后对于每个样品去处理的时候都得用软件进行重复的处理,才能得出有效的信息。这样不仅工作量相当大,自己也会感到非常厌烦。一般我碰到这种时候是不能忍的,所以就通过手头能用到的东西,简化了工作。今天就给大家介绍一下我自己的解决办法。

    首先我们看一下我们要处理的数据内容,是一堆excel文件,而excel文件里面的数据是仪器的的测试数据。


    Fig.1. 文件夹中的数据

    首先我们要做的就是把数据读取出来,这里会用到MATLAB里的几个函数,首先是dir函数,此函数的作用是获取特定地址文件夹中的文件列表。用法如下:

    path='D:\my_data\test data\IV data\20171116\'
    %此处文件地址改为需要的文件夹路径
    Files = dir(strcat(path,'*.xlsx'));
    

    其中Files是我们命名的变量,而path是文件夹的地址,strcat是横向连接字符的函数,这样相当于是把文件列表中的每个xlsx文件的地址和名称获取了,然后存到了一个数组中,数组名为Files。
    然后,我们需要知道这个数组的长度,所以应用length函数获取数组长度

    LengthFiles = length(Files);
    

    接下来就是对每一个文件读取其中的数据,并且将其存到一个与原始数据大小一致的二维矩阵中。

    for i = 1:LengthFiles
        xls_data = xlsread(strcat(path,Files(i).name));
        file_name=Files(i).name;
        [m,n]=size(xls_data);
    end
    

    上面代码中应用循环结构,对每个文件都采用数据读取函数,MATLAB中excel文件的读取函数是xlsread,其用法与dir函数类似,都需要strcat函数来对文件的地址和名称连接,然后作为函数的参数。最后的[m,n]是用于获取每个文件的数据的大小,其中m是数据的行数,n是数据的列数。

    到这里我还只是获取文件的数据和文件的地址吗,名字而已。未对数据做出任何处理。下面我们以画图为例,展示批量处理数据然后每个数据输出图片。这里我的每个文件数据中还有很多列有用的,相当于每个文件中又有单独的几个器件的数据。这样我还需要一层循环结构:

    for j=3:3:n-1
           set(gcf,'visible','off')%设置图片弹窗为不可见
           zeroparameter = xls_data((m+1)/2,j+1);%取X轴零点处的y坐标
           y = xls_data(:,j+1)- zeroparameter;%将纵坐标归零
               
           plot(xls_data(:,j),abs(y));%画图
           semilogy(xls_data(:,j),abs(y));%将y轴变量取对数
           axis([-2,2,1E-12,1E-4]);%设定y轴的范围为固定的,此处设定坐标轴的语句必须置于将y轴变量取对数的语句之后 
           xlabel('Voltage(V)');% x轴名称
           ylabel('Current(A)');
           k=j/3;
           saveas(gcf,[path,strcat(file_name,'-',num2str(k)),'.jpg']);%输出图形到指定地址
           delete(gcf);
       end
    

    这里大家可以自行修改,比如我的文件里面还有独立的组,那我就还需要一层循环,但是如果你的文件里只有一组数据,那你就不需要在加一层循环。

    我这里是每三列数据为一组,所以我这里循环的步长是j=3:3:n-1,但是其实你也可以根据自己的来定。还有我的数据测试了之后会在零点处有一点漂移,所以我对妹一组数据都会获取零点处的漂移量,然后将整体的数据都平移,使得零点归零。

    还有一些对图片属性设置的,比如我把图片的弹框设置为不可见,这样在循环过程中画图的时候就不会弹框,不然MATLAB是默认会弹框的,其实我们这种画图的方法其实是调用MATLAB本身的画图函数,然后遍历每个文件的每组数据,将其画图,然后将画出的图保存到指定的地址。所以上面关于图片的属性其实都可以在保存图片之前进行修改设定。像我上面的情形就是对图片设置了一下,首先对y轴的变量值进行了绝对值处理,然后对y轴取对数,相当于图片中y轴显示为对数坐标的模式。然后我还设定了一下坐标的范围,这些都是可以设定,大家也可以去搜索命令,对图片进行自己需要的参数设定。

    最后,是代码整体的效果。测试可行的结果以下面的代码为准!

    path='D:\my_data\test data\IV data\20171116\';
    %此处文件地址改为需要的文件夹路径
    
    Files = dir(strcat(path,'*.xlsx'));
    LengthFiles = length(Files);
    %%将每次测试不同器件的数据都画图
    for i = 1:LengthFiles
        xls_data = xlsread(strcat(path,Files(i).name));
        file_name=Files(i).name;
        [m,n]=size(xls_data);
        %%将每个器件多次重复测试的数据都画图
        for j=3:3:n-1
           set(gcf,'visible','off')%设置图片弹窗为不可见
           zeroparameter = xls_data((m+1)/2,j+1);%取X轴零点处的y坐标
           y = xls_data(:,j+1)- zeroparameter;%将纵坐标归零
               
           plot(xls_data(:,j),abs(y));%画图
           semilogy(xls_data(:,j),abs(y));%将y轴变量取对数
           axis([-2,2,1E-12,1E-4]);%设定y轴的范围为固定的,此处设定坐标轴的语句必须置于将y轴变量取对数的语句之后 
           xlabel('Voltage(V)');% x轴名称
           ylabel('Current(A)');
           k=j/3;
           saveas(gcf,[path,strcat(file_name,'-',num2str(k)),'.jpg']);%输出图形到指定位置
           delete(gcf);
       end
    end
    clear;
    clc;
    

    以上代码均为原创,转载请告知。
    另外,由于本人没有啥编程背景,所以水平有限。有和疏漏或不当的地方还请轻拍指正。向各位虚心请教!
    欢迎关注微信公众号(ID:薛定谔不在家)获取更多科研软件技巧的文章~

    image.png

    相关文章

      网友评论

        本文标题:利用MATLAB批量完成科研数据处理

        本文链接:https://www.haomeiwen.com/subject/xylbvxtx.html