1 题目简介
题目来源于2019年中国研究生数学建模竞赛D题——汽车行驶工况构建。
2 涉及内容
在本次实战的数据分析过程中,涉及以下技术内容:
(1)数据预处理技术
(2)for循环的使用
(3)暴力搜索方法
3 实战步骤
3.1 读取数据
我将三个数据表合成了一个,
dir_data='2019年中国研究生数学建模竞赛D题\原始数据\汇总.xlsx';
warning('off');
data_raw=readtable(dir_data);
%取出时间和速度
time=data_raw{:,1};
time_num=datenum(time);%将时间类型转换为double类型
chesu=data_raw{:,2};
3.2 速度线性插值
如果两点间隔小于5秒,对两点之间的速度进行线性插值,按1秒的间隔补足速度点,
time_second=time_num(2)-time_num(1);%一秒的大小
x_cha=[];%存放要插值的时间点
for i=2:length(time_num)
time_jiange=time_num(i)-time_num(i-1);
if (time_jiange>time_second) && (time_jiange<=5*time_second)
tem1=time_num(i-1):time_second:time_num(i);
x_cha=[x_cha,tem1];
end
end
chesu_cha=interp1(time_num,chesu,x_cha,"linear");%线性插值
%按时间升序重新排序,实现把新插值点和原数据点合在一起
chesu_zeng=[chesu;chesu_cha'];
time_num_zeng=[time_num;x_cha'];
[time_num_zeng,I] = sort(time_num_zeng);
chesu_zeng=chesu_zeng(I);
3.3 标记断点位置
两点时间间隔超过5秒的,视为断点,对其位置进行标记,
duan=zeros(length(time_num_zeng),1);%标记断点位置,1表示是断点
for i=2:length(time_num_zeng)
time_jiange=time_num_zeng(i)-time_num_zeng(i-1);
if time_jiange>5*time_second
duan(i)=1;
end
end
3.4 丢弃小于20秒的片段
两个断点之间的片段如果小于20秒,则丢弃,
duan_ind=find(duan==1);
del_ind=[];%存放要删除的点的索引位置
if (time_num_zeng(duan_ind(1)-1)- time_num_zeng(1))<20*time_second %判断第一个断点之前的部分是否少于20秒
tem1=1:(duan_ind(1)-1);
del_ind=[del_ind,tem1];
end
for i=2:length(duan_ind) %判断第二个断点到最后一个断点之间的部分是否少于20秒
if (time_num_zeng(duan_ind(i)-1)- time_num_zeng(duan_ind(i-1)))<20*time_second
tem1=duan_ind(i-1):(duan_ind(i)-1);
del_ind=[del_ind,tem1];
end
end
if (time_num_zeng(end)- time_num_zeng(duan_ind(end)))<20*time_second %判断最后一个断点之后的部分是否少于20秒
tem1=duan_ind(end):length(time_num_zeng);
del_ind=[del_ind,tem1];
end
time_num_zeng(del_ind)=[];
chesu_zeng(del_ind)=[];%执行删除操作
3.5 重新锁定断点位置
执行上述删除操作后,断点位置发生变化,需重新锁定断点位置,
du