1.元胞數組應用:
①將一個數組存儲在一個元胞中,用以下代碼(注意{}的使用)
dri_ID_all1{1,1} = ones(67,1); dri_ID_all1{2,1} = 2*ones(56,1); dri_ID_all1{3,1} = 3*ones(57,1); dri_ID_all1{4,1} = 4*ones(48,1); dri_ID_all1{5,1} = 5*ones(45,1); dri_ID_all1{6,1} = 6*ones(51,1);
變量如下:
小擴展:
①可以與find合用,根據對valid_index的條件索引,將不同類別數據的索引存儲在不同的元胞中。
file_index = cell(file_num,1); %按照駕駛員對換道路段進行分類 file_index{1} = valid_index(find(valid_index>=1,1):find(valid_index>=15,1)); %駕駛員1的index:valid_index在[1:15]范圍內的路段: file_index{2} = valid_index(find(valid_index>=16,1):find(valid_index>=28,1)); %駕駛員2的index:...[16:28]; file_index{3} = valid_index(find(valid_index>=29,1):find(valid_index>=49,1)); %駕駛員3的index:...[29:49]; file_index{4} = valid_index(find(valid_index>=50,1):find(valid_index>=69,1)); %駕駛員4的index:...[50:69]; file_index{5} = valid_index(find(valid_index>=70,1):find(valid_index>=76,1)); %駕駛員5的index:...[70:76]; file_index{6} = valid_index(find(valid_index>=77,1):find(valid_index>=80,1)); %駕駛員6的index:...[77:80];
變量如下:
②根據類別索引,提取出該段數據的其他屬性值,存儲在其他的元胞數組中。
根據每個類比的索引元胞值,提取表格中對應類別的某個屬性值,屬性值也按照類別分類,結果存儲在6個元胞中。
for j = 1:file_num episode_start_set{j} = rawdata(file_index{j},6); %提取路段起始點(類別:第i名駕駛員,屬性:路段起始時間點);6表示rawdata第六列是原始數據的起始時間點 episode_end_set{j} = rawdata(file_index{j},8); %提取路段終點(類別:第i名駕駛員,屬性:路段結束時間點) ; %提取路段起始點(類別:第i名駕駛員,屬性:路段起始時間點) sen_ID_set{j} = rawdata(file_index{j},4); %提取場景ID dri_ID_set{j} = cell2mat(rawdata(file_index{j},3)); %提取駕駛員ID end
③載入已經解析出的所有屬性,將路段各個屬性均按類別進行划分提取並存儲。
if dri_index == 1
load more_lc_dri1_file1.mat;
else
load more_lc_dri1_file2.mat;
end
for j = 1:length(file_index{dri_index}) %length(file_index{dri_index})是每個駕駛員對應的有效路段的個數
veh_start(j) = find(TimeSpeed>episode_start_set{dri_index,1}{j,1},1); %veh_start存的都是第幾個時間點,而不是准確時刻,兩個時間點之間時間間隔為0.045s
veh_end(j) = find(TimeSpeed>episode_end_set{dri_index,1}{j,1},1);
Time_set{dri_index,j} = TimeSpeed(veh_start(j):veh_end(j));
AccPedalPos_short{dri_index,j} = AccPedalPos(veh_start(j):veh_end(j));
...
end
load more_lc_dri1_file1.mat;
else
load more_lc_dri1_file2.mat;
end
for j = 1:length(file_index{dri_index}) %length(file_index{dri_index})是每個駕駛員對應的有效路段的個數
veh_start(j) = find(TimeSpeed>episode_start_set{dri_index,1}{j,1},1); %veh_start存的都是第幾個時間點,而不是准確時刻,兩個時間點之間時間間隔為0.045s
veh_end(j) = find(TimeSpeed>episode_end_set{dri_index,1}{j,1},1);
Time_set{dri_index,j} = TimeSpeed(veh_start(j):veh_end(j));
AccPedalPos_short{dri_index,j} = AccPedalPos(veh_start(j):veh_end(j));
...
end
④在已經分好類的基礎上再進一步進行分類重組(但是帶上原來類別的tag)
dri_ID存儲為成以下的元胞數組內,每一行為一個駕駛員,每個駕駛員對應的路段場景為[1:10],[82,80,88,87,74,71]分別表示有對應個數的路段;每個路段歸屬於10種場景中的一種,對應的場景編號存儲在每個元胞的數組中。
82x1 cell 80x1 cell 88x1 cell 87x1 cell 74x1 cell 71x1 cell
⑤按照另一分類標准進行分類,但將原來類別的分類ID存儲在某個元胞數組中。
示例:將已經按照駕駛員分好類的路段,按照場景進行重組。按按場景分類后,每個路段對應的駕駛員編號和路段序號存儲在sen1,sen2,...sen10中。
one = 1;two = 1;thr = 1;fou = 1;fiv = 1; six = 1;sev = 1;eig = 1;nin = 1;ten = 1; for m = 1:6 for j = 1:length(sen_ID_all{m}) if cell2mat(sen_ID_all{m}(j))==1 sen1{one} = [m,j]; one = one+1; elseif cell2mat(sen_ID_all{m}(j))==2 sen2{two} = [m,j]; two = two+1; elseif cell2mat(sen_ID_all{m}(j))==3 sen3{thr} = [m,j]; thr = thr+1; elseif cell2mat(sen_ID_all{m}(j))==4 sen4{fou} = [m,j]; fou = fou+1; elseif cell2mat(sen_ID_all{m}(j))==5 sen5{fiv} = [m,j]; fiv = fiv+1; elseif cell2mat(sen_ID_all{m}(j))==6 sen6{six} = [m,j]; six = six+1; elseif cell2mat(sen_ID_all{m}(j))==7 sen7{sev} = [m,j]; sev = sev+1; elseif cell2mat(sen_ID_all{m}(j))==8 sen8{eig} = [m,j]; eig = eig+1; elseif cell2mat(sen_ID_all{m}(j))==9 sen9{nin} = [m,j]; nin = nin+1; elseif cell2mat(sen_ID_all{m}(j))==10 sen10{ten} = [m,j]; ten = ten+1; end end end
⑥元胞數組的索引:
示例:senN{m}(1),{m}為提取第m個元胞,(1)為提取該元胞的第1個數值。
if s_index ==1 % 根據想要提取的場景類別,設置s_index。若想提取場景1的屬性數據,則設置s_index=1 senN = sen1; elseif s_index ==2 senN = sen2; elseif s_index ==3 senN = sen3; elseif s_index ==4 senN = sen4; elseif s_index ==5 senN = sen5; elseif s_index ==6 senN = sen6; elseif s_index ==7 senN = sen7; elseif s_index ==8 senN = sen8; elseif s_index ==9 senN = sen9; elseif s_index ==10 senN = sen10; end for m = 1:length(senN) a = senN{m}(1); %表示第a個駕駛員,b表示第a個駕駛員的第b個路段 b = senN{m}(2); dri_ID_mat{s_index,m} = senN{m}(1); %dri_ID_mat記錄按場景分類的換道路段對應的駕駛員編號 Time_set_sen{s_index,m} = Time_set_all(a,b); AccPedalPos_short_sen{s_index,m} = AccPedalPos_all(a,b); Ay_short_sen{s_index,m} = Ay_all(a,b) ; BrakePedalPos_short_sen{s_index,m} = BrakePedalPos_all(a,b); ... TTC_short_sen{s_index,m} = TTC_all(a,b); TurnLeftLight_short_sen{s_index,m} = TurnLeftLight_all(a,b); TurnRightLight_short_sen{s_index,m} = TurnRightLight_all(a,b); end
⑦元胞數組的拼接
for j = 1:88 %67+21=88,兩個表格的數據個數分別為67和21 for i = 1:6 %有6個駕駛員(第一種類別) if j>=1 && j<=67 %第一個表格的數據賦值 if j>=1 && j<=67 load episodeall_lc_minus5_6dri_biao1.mat; Time_set_all{i,j} = Time_set{i,j}; 。。。 elseif j>=68 && j<=88 load episodeall_lc_6dri_moreplus.mat; Time_set_all{i,j} = Time_set{i,j-67}; 。。。 end end end % 將sen_ID_all 改為和特征一樣的拼接形式 sen_ID_all = sen_ID_all1(:,1); dri_ID_all = dri_ID_all1(:,1); for j = 1:6 for i = 68:67+length(sen_ID_all1{j,2}) % for i = 31:30+length(sen_ID_set_all{j,2}) sen_ID_all{j,1}{i,1} = sen_ID_all1{j,2}{i-67,1}; dri_ID_all{j,1}(i,1) = dri_ID_all1{j,2}(i-67,1); % dri_ID_all{j,1}{i,1} = sen_ID_set_all{j,2}{i-30,1}; end end % 如果有第三張表; 改為 % % sen_ID_all = sen_ID_set_all(:,1); % 只取第一列的ID % % for j = 1:6 % % for i = 68:67+length(sen_ID_set_all{j,2}) % % sen_ID_all{j,1}{i,1} = sen_ID_set_all{j,2}{i-67,1}; % % end % % for i = xx+1:xx+length(sen_ID_set_all{j,3}) % % sen_ID_all{j,1}{i,1} = sen_ID_set_all{j,2}{i-xx,1}; % % end % % % %xx為第三張表中max{單個駕駛員的換道路段個數} % % end
2.從兩個數組中提取出兩者共有的數據
a=[1,2,5,6,8]; b=[3,5,8,9,10]; % 實現步驟: c=[a,b]; d=sort(c); for i = 1:length(d)-1 if d(i+1)==d(i) d(i)=0; end end e = d(find(d));