1. 程式人生 > >9-10月 matlab學習

9-10月 matlab學習

資料清洗:

a=sortrows(a,1); %% 按時間排序      sort要求每一列
while n<length(a(:,1))      %%進入迴圈直到n不再小於N_T時停止
    %if RT(n+1)-RT(n)>=0      %%判斷時間是否為增量
        if RD(n+1)-RD(n)>=0   %%判斷里程是否為增量
            if RD(n+1)-RD(n)>=value1  %%判斷前後里程差是否大於5km
                if (RD(n+1)-RD(n))/(RT(n+1)-RT(n))/24>value2  %%判斷車速是否大於120km/h
                    x=0;        %%大於120km/h 視為資料異常,將差值賦0
                else            %%小於120km/h 視為正常資料,
                    x=RD(n+1)-RD(n);  %%計算前後差值
                end
            else                     %%里程差小於5km 視為正常資料
                x=RD(n+1)-RD(n);     %%計算前後差值
            end
        else                        %%若里程為減小量視為異常資料
            x=0;                    %%將差值賦0
        end
    d(n+1,1)=d(n,1)+x;            %%計算清洗後的里程值
    z(n,1)=d(n);
    z(n,2)=T(n);
    n=n+1;
end

空擋滑行:

根據三組資料的範圍判斷,取三組條件都被滿足的資料


for i=1:N_T
   if(Torque(i,2)>=0&&Torque(i,2)<=value1&&X1==0)
       t1=Torque(i,1);
       X1=1;
   elseif (Torque(i,2)>10&&X1==1)
           t2=Torque(i-1,1);
           X1=0;
           if((t2-t1)*24*3600>=value4)
              %  y(i)=(t2-t1)/24/3600;
              stc=0;
                for n=1:N_R
                   if(Rpm(n,1)>=t1&&stc==0)
                       stc=1;
                       t3=Rpm(n,1);
                    elseif(Rpm(n,1)==t2&&stc==1)
                         stc=0; 
                         t4=Rpm(n,1);
                         break
                    elseif(Rpm(n,1)>t2&&stc==1)
                         stc=0; 
                         t4=Rpm(n-1,1);
                         break
                     elseif(Rpm(N_R,1)<t2)
                       t3=0;t4=0;
                    end   
                end
                 if((t4-t3)*24*3600>=value4)
                    L1=find(Rpm(:,1)==t3);
                    L2=find(Rpm(:,1)==t4);
                    R=0;
                    for j=L1:L2
                    if(Rpm(j,2)>=value2&&Rpm(j,2)<=value3&&R==0)
                       T3=Rpm(j,1);
                       R=1;
                    elseif(Rpm(j,2)>value3||Rpm(j,2)<value2)&&R==1
                        T4=Rpm(j-1,1);
                        R=0;
                        break
                    elseif(Rpm(j,2)>=value2&&Rpm(j,2)<=value3&&R==1)
                        T4=Rpm(j,1);
                    end
                    end
                  if((T4-T3)*24*3600>=value4)
                    %T=[t3 t4];
                    stc1=0;
                      for m=1:N_R
                         if(Speed(m,1)>=T3&&stc1==0)
                            stc1=1;
                            t5=Speed(m,1);
                         elseif(Speed(m,1)==T4&&stc1==1)
                             stc1=0;
                             t6=Speed(m,1);
                             break
                         elseif(Speed(m,1)>T4&&stc1==1)
                             stc1=0;
                             t6=Speed(m-1,1);
                             break
                         elseif(Speed(N_R,1)<T4)
                             t5=0;t6=0;
                         end
                      end
                   if((t6-t5)*24*3600>=value4)
                      L3=find(Speed(:,1)==t5);
                      L4=find(Speed(:,1)==t6);
                      S=0;
                      for d=L3:L4  
                          if(Speed(d,2)<=0)
                             S=1;
                             break
                          end
                      end
                      if S==0 
                         f=f+1;
                         T(f,1)=t5;
                         T(f,2)=t6;
                         T0=t5-(10/3600/24);
                         T1=t6+(10/3600/24);
                         %plot(Rpm(:,1),Rpm(:,2)/20,'r');
                         %hold on;
                         %plot(Speed(:,1),Speed(:,2),'k');
                         %hold on;
                         %plot(Torque(:,1),Torque(:,2),'b')
                         axis([T0 T1 0 120]);
                         hold on;
                         plot([T(f,1),T(f,1)],[0,120],'g');
                         hold on
                         plot([T(f,2),T(f,2)],[0,120],'g')
                      end
                    end
                  end
                 end
           end
   end
end

工況提取:

time2=(cyc_T_E(1,1)*86400:1:cyc_T_E(end,1)*86400)';%時間刻度化為1S
time2=unique(cellstr(datestr(time2/86400,31)));%去重
time2=datenum(time2);%時間轉化為數值
cyc_T_E_int(:,1)=time2;%時間存檔
cyc_T_E_int(:,2)=interp1(cyc_T_E(:,1),cyc_T_E(:,2),time2);%海拔插值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%整合資料%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[~,ia,ib]=intersect(cellstr(datestr(time1,31)),cellstr(datestr(time2,31)));
data_use=[cyc_T_D_S_int(ia,1),cyc_T_D_S_int(ia,3),cyc_T_D_S_int(ia,2),cyc_T_E_int(ib,2)];
save('D:\MATLAB R2016\cyc_kyx64\data_use')

提取路段:

% *---------------讀取資料庫中合適範圍的資料----------sql-------------------**
conna = database('test','postgres','postgres', 'org.postgresql.Driver', 'jdbc:postgresql://172.16.6.40/test');
% 32表示空格,13表示回車
sqlText_s=strcat('SELECT * FROM "ElevationStatic2018" where longitude between',32,num2str(minlon),32,'and',32,num2str(maxlon),32,'and latitude between',32,num2str(minlat),32,'and',32,num2str(maxlat));
curs = exec(conna,sqlText_s);
data103=fetch(curs);
data103=data103.Data;
close(curs);

找車號:

%%%%%%%%%%根據想要的路段在座標範圍內找車號%%%%%%%%%%%%%%
for i = 3:length(a)
    b = dir(strcat(cd,'\103#31\',a(i).name));
%     for j = 3:length(b)
         load(strcat(cd,'\103#31\',a(i).name))
        [~,n] = ismember(cell2mat(StatisticalMatrix(:,1:2)),data103(:,2:3),'rows');
        if ~isempty(n)
            f = find(n~=0);
            for k = 1:length(f)
                OUTPUT(z,:) = StatisticalMatrix(f(k),[1,2,5]);
                z = z + 1;
            end
        end
end
% end

Terminal = [];     
for i = 1:length(OUTPUT(:,1))
    Terminal = [Terminal;(OUTPUT{i,3})'];
end
Terminal = unique(Terminal);

經緯度匹配海拔:

%%-----------------使用車輛gps資料匹配資料庫中海拔資料------------------%-
myroadGps=myroad;
nullnum=zeros(length(myroadGps(:,1)),1); % 記錄每一行經緯度是否能匹配到資料庫中的點,如果能匹配到為0,不能匹配到為1
replace=zeros(length(myroadGps(:,1)),1); % 記錄每一行替代值的行
for k=1:length(myroadGps(:,1))
    minlon = myroadGps(k,2)-0.0005;
    maxlon = myroadGps(k,2)+0.0005;
    minlat = myroadGps(k,3)-0.0005;
    maxlat = myroadGps(k,3)+0.0005;
    in=inpolygon(data103(:,2),data103(:,3),[minlon,maxlon],[minlat,maxlat]);
    loc = find(in==1);
    if ~isempty(loc)
        % 並對資料進行計算,找到合適替換點
        [~,minloc]=min(distance(myroadGps(k,3),myroadGps(k,2),data103(loc,3),data103(loc,2))*pi/180*6371*1000);
        replace(k,1)=loc(minloc);
    else
        nullnum(k,1)=1;
    end
end

myroadGps(nullnum==1,5)=1; % 未匹配到資料的值
% ------------填充替代資料------------**
% 其中不能匹配到資料的經緯度點,使用其自身資料來進行補充。即未匹配的資料不處理
replaceloc=find(replace(:,1)~=0);
if ~isempty(replaceloc)
    myroadGps(replaceloc,[2,3,6]) = data103(replace(replaceloc),[2,3,6]);
    [replace,ia,ib]=unique(replace,'stable'); % 對替代資料行數的記錄進行去重
    for k=1:length(ia)
        loc=find(ib==k);
        if length(loc)>1 && replace(k)~=0
            ib(loc(2:end,:))=[];
            myroadGps(loc(2:end),:)=[];
        end
    end
end

advisor模型搭建:

配置檔案,simulink模型,工況匯入