zoukankan      html  css  js  c++  java
  • Matlab之数据处理

    写在前面的,软件不太强大,每次保存都需要生成rec和dark的文件,在处理是只需要一个就行了,所有网上查看了下运用批处理的命令去掉多余的文件:

    解决办法:windows命令模式下CMD进入文件的目录,输入命令:del /q *rec*.csv(*rec*就是需要删除的包含rec的文件)

    昨天下午搞了一个下午的数据提取,想过了用多种方法包括java,delphi等,最后还是想到用Matlab比较方便,选对工具真的很重要啊

    我的数据格式:有多个csv文件,对我有用的只有B15:B270的数据,如何提取,看下面代码:

    wave = csvread('.darkdark.csv',14,0,[14,0,269,0]);%看参数,具体参数的功能参考相应的Matlab书籍
    dark =csvread('.darkdark.csv',14,1,[14,1,269,1]);%获取背景参数,当前目录的下级目录
    ref = csvread('.
    ef
    ef.csv',14,1,[14,1,269,1]);%获取参比
    B = ref-dark;
    files = dir('*.csv');%获取当前目录的文件数,注意读取的是csv文件
    l = length(files);
    C = [];
    for i = 1:l
        filename = files(i).name;%获得文件名
        A=csvread(filename,14,1,[14,1,269,1]);%读入指定列的数据,详细参数功能参考对应的代码
        D = B./(A-dark);%矩阵对应的数相除
        C = [C D];%矩阵列合并
    end
    E = [wave log10(C)];
    %dlmwrite('result.txt',C,'delimiter','	');%以文本的形式输出,注意指定精确度'precision','%f32'
    xlswrite('result.xlsx',E,'Sheet1');%xls的形式输出
    msgbox(['complete! ' num2str(l) ' xls files.']);

    后来跑数据不好,分析原因是没有去三次的平均值,我是每一个位置光谱扫了三次,但是对应的化学只有一个值(一开始我的办法是三次都是取同一个化学值,但是这样的做法是不对的),所有在原有的基础上,每隔3列取一次平均值,算法如下(代码比较简单):

    A = xlsread('result.xlsx','Sheet1','B3:PE258');
    [m,n]=size(A);
    B=[];
    for i=3:3:n%第二个参数是步长
        temp = A(:,i-2:i);
        C = mean(temp,2);
        B=[B C];
    end
    xlswrite('mean_3.xlsx',B,'Sheet1');%xls的形式输出
    msgbox(['complete! ']);

    以上就提取完成了,但是化学值是必须自己手动写的,那个真叫一个辛苦,420个数据还好吗,真的还好吗?

    方法是通用的,以后读取xls的文件可以对应的用xlsread和xlswrite方法来写,类似能读的文本还有txt、dat......

    关于常见的光谱数据的处理,对于同一个点的三次的取平均值的matlab的算法:

    B=[];%产生一个空矩阵,
    for i=0:14
    data=zeros(396,1);%生成一个行*列为396*1的零矩阵     
    for j=1:3
        s=strcat(num2str(i),'-',num2str(j),'.txt');%'-'是取得i和j之间的链接符。如果是1.2那就是'.'。
        k=importdata(s);
        t=k(:,2);%如果原数据的第一列是光的波数,第二列才是吸光度,那么这里写2
        data=data+t;%注意矩阵的相加
    end
        data=data/3;%举证的除法运算,其中每个点都除以3
        B=[B,data];
    end

     关于近红外光谱的吸光度的算法,偶然在一个java程序中看见的计算方法:

    result[i] = Math.abs(Math.round(((resultQ[i] - resultDark[i]) / (double)(resultLight[i] - resultDark[i])) * 10000) / 10000.0);//此处得到的是透射率T%
    result[i] = -Math.log10(result[i]);//得到吸光度abs

     Matlab实现曲线拟合

    function string = curveFitting(a,x,y)
    %spfit  拟合两组数据的线性关系
    %a  拟合的次数
    %x  x轴数据
    %y  y轴数据
    fx=polyfit(x,y,a)%结果返回a次拟合多项式系数,从高次到低次依次存放到变量fx中; 
    yvalue=polyval(fx,x);%求得多项式在x0处的值y0;
    ymean=mean(y);
    Rsquare=(norm(yvalue-ymean)/norm(y-ymean))^2 %求得相关系数R的平方进行输出
    SC=[];
    Temp=[];
    for i =1:a
        if fx(i) > 0
            if i >1
                string = ['+',num2str(fx(i))];
            else
                string = num2str(fx(i));
            end
        else
            string = num2str(fx(i));
        end
        Temp = [string,['x^',num2str(a+1-i)]];
        SC = [SC,Temp];
    end
    if fx(a+1) > 0
        lastString = ['+',num2str(fx(a+1))];
        SC =[SC,lastString];
    else
        SC = [SC,num2str(fx(a+1))];
    end
    %画图程序(x,y)对应的点,x1y1对应的是带入拟合后的点
    x1=x(1):0.2:x(length(x));%0.2是步长,不是特别要求
    y1=polyval(fx,x1);
    plot(x,y,'b*',x1,y1,'g');
    xlabel(strcat('拟合方程:y=',SC));

    Matlab批量到数据(二维荧光数据处理)

    B=[];%产生一个空矩阵
    for i=0:14
    data=zeros(396,1);%生成一个行*列为396*1的零矩阵     
    for j=1:3
        s=strcat(num2str(i),'-',num2str(j),'.txt');%'-'是取得i和j之间的链接符。如果是1.2那就是'.'。
        k=importdata(s);
        t=k(:,2);%如果原数据的第一列是光的波数,第二列才是吸光度,那么这里写2
        data=data+t;
    end
        data=data/3;
        B=[B,data];
    end
  • 相关阅读:
    Django集成CAS
    JAVA命名规范
    Mybatis(5)——动态SQL
    Mybatis(4)——ResultMap
    Mybatis(3)——参数处理
    Mybatis(2)——Mapper映射文件
    Mybatis(1)——配置文件
    Gson(http://www.jianshu.com/p/e740196225a4)
    Gson中fromJson方法
    SessionAttributes和ModelAttribute
  • 原文地址:https://www.cnblogs.com/sowhat4999/p/4439862.html
Copyright © 2011-2022 走看看