matlab元胞數組應用、幾個小技巧記錄


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在[115]范圍內的路段:
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

④在已經分好類的基礎上再進一步進行分類重組(但是帶上原來類別的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));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM