利用常用软件批量完成科研数据处理
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:薛定谔不在家)获取更多科研软件技巧的文章~
网友评论