9-10月 matlab學習
阿新 • • 發佈:2018-12-20
資料清洗:
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模型,工況匯入