MHT代码阅读(2)

MHT代码阅读(2)

2. updateICL

2.1 代码实现

  1. 补充

    • 在MHT.m文件中
      • obsTreeSet(观测树),stateTreeSet(状态树),scoreTreeSet(得分树),idTreeSet(id树),activeTreeSet(活跃树)
      • 所有的其他集合都与这五个原始集合相关
    • cell生成元胞数组
  2. ICL=incompabilityList,不兼容轨迹集合

    • 当轨迹有共同观察时,称为不兼容
    • 共享观测的轨迹被定义为不兼容的,并且每次扫描都保留不兼容轨迹的记录。当轨迹被删除以及根据当前扫描的观察结果形成新轨迹时,该记录会更新。
    • 聚类的过程是将通过共同观察链接起来的所有轨迹的集合。
  3. 初始化不兼容轨迹集合

  4. 将树信息存储在表中,因为现在树操作很慢

    • Cache-缓存
    • 初始化treeIndCache、trackIDCache、ICLCache、indexMapping
  5. 删除不活跃的轨迹

    MHT代码阅读(2)_第1张图片

    • 用到obsMembership,在formTrackFamily中出现
    • obsMembership{i}=[obsMembership{i}; [familyID 1 trackID]]
  6. 寻找不兼容航迹

    • 查找来自同一族群的不兼容轨迹。 这在创建新族时执行一次。
    • 从父节点找到不兼容的轨迹
    • 从其他族群找到不兼容的轨迹
    • 检测叶节点是否是虚拟节点
    • 去除多余的轨迹

2.2 代码附录

%%ICL=incompabilityList:聚类的过程是将通过共同观察链接起来的所有轨迹的集合。共享观测的轨迹被定义为不兼容的,并且每次扫描都保留不兼容轨迹的记录。当轨迹被删除以及根据当前扫描的观察结果形成新轨迹时,该记录会更新。
function [incompabilityListTreeSet, incompabilityListTreeNodeIDSet]=...
    updateICL(obsTreeSet, idTreeSet, incompabilityListTreeNodeIDSetPrev,...
    activeTreeSet, cur_observation, obsMembership)
--------------------------------------------------------------------------------------------------------------------------- 
    %%
    familyNo=length(obsTreeSet);
    if familyNo ~= 0
        incompabilityListTreeSet(familyNo,1)=tree;
        incompabilityListTreeNodeIDSet(familyNo,1)=tree;
    else
        incompabilityListTreeSet=[];
        incompabilityListTreeNodeIDSet=[];
        return
    end
--------------------------------------------------------------------------------------------------------------------------- 
    %%
    % initialize the incompability lists
    for i=1:familyNo        
        incompabilityListTreeSet(i)=tree(idTreeSet(i),'clear');
        incompabilityListTreeNodeIDSet(i)=tree(idTreeSet(i),'clear');
    end
---------------------------------------------------------------------------------------------------------------------------
    %%
    % 将树信息存储在表中,因为现在树操作很慢
    % Cache-缓存
    treeIndCache=cell(length(incompabilityListTreeNodeIDSetPrev),1);
    trackIDCache=cell(length(incompabilityListTreeNodeIDSetPrev),1);
    ICLCache=cell(length(incompabilityListTreeNodeIDSetPrev),1);
    indexMapping=cell(length(incompabilityListTreeNodeIDSetPrev),1);
    for i=1:length(incompabilityListTreeNodeIDSetPrev)
        treeInd=findleaves(incompabilityListTreeNodeIDSetPrev(i));
        treeIndCache{
     i}=cell(length(treeInd),1);
        trackIDCache{
     i}=cell(length(treeInd),1);
        ICLCache{
     i}=cell(length(treeInd),1);
        indexMapping{
     i}=zeros(treeInd(end),1);
        for j=1:length(treeInd)       
            ICLCache{
     i}{
     j}=incompabilityListTreeNodeIDSetPrev(i).get(treeInd(j));
            indexMapping{
     i}(treeInd(j))=j;       
            childList=idTreeSet(i).getchildren(treeInd(j));       
            if ~isempty(childList)
                treeIndCache{
     i}{
     j}=zeros(length(childList),2);  % [familyID branchInd]
                trackIDCache{
     i}{
     j}=zeros(length(childList),2);  % [familyID trackID]
                for k=1:length(childList)
                    if activeTreeSet(i).get(childList(k)) ~= 1
                        continue;
                    end
                    treeIndCache{
     i}{
     j}(k,:)=[i childList(k)];
                    trackIDCache{
     i}{
     j}(k,:)=idTreeSet(i).get(childList(k));
                end
                idx=(trackIDCache{
     i}{
     j}(:,2)==0);
                trackIDCache{
     i}{
     j}(idx,:)=[];
                treeIndCache{
     i}{
     j}(idx,:)=[];
            end       
        end
    end
---------------------------------------------------------------------------------------------------------------------------
    %%
    % delete nonactive tracks 
    % obsMembership?在formTrackFamily中出现
    for i=1:length(obsMembership)
        if ~isempty(obsMembership{
     i})
            obsInd=zeros(size(obsMembership{
     i},1),1);
            for j=1:size(obsMembership{
     i},1)
                if activeTreeSet(obsMembership{
     i}(j,1)).get(obsMembership{
     i}(j,2))~=1
                   obsInd(j)=1;
                end
            end
            obsInd=~~obsInd;
            obsMembership{
     i}(obsInd,:)=[];
        end
    end
---------------------------------------------------------------------------------------------------------------------------
    %%
    % find incompatible tracks
    for i=1:familyNo
        treeInd=findleaves(obsTreeSet(i));         
        for j=1:length(treeInd)       
            if activeTreeSet(i).get(treeInd(j)) ~= 1
                continue;
            end
            idTemp=idTreeSet(i).getparent(treeInd(j));
            % find incompatible tracks from the same family. This is done once when a new family is created.
            % 查找来自同一族群的不兼容轨迹。 这在创建新族时执行一次。
            if idTemp==0        
                incompabilityListTreeSet(i)=incompabilityListTreeSet(i).set(treeInd(j),idTreeSet(i).get(treeInd(j)));   
                incompabilityListTreeNodeIDSet(i)=incompabilityListTreeNodeIDSet(i).set(treeInd(j), [i treeInd(j)]);
            % find incompatible tracks from parents nodes 
            % 从父节点找到不兼容的轨迹
            else                                         
                iclParentTemp=ICLCache{
     i}{
     indexMapping{
     i}(idTemp)};
                incompabilityListSet=[];
                incompabilityNodeIDListSet=[];
                for k=1:size(iclParentTemp,1)
                    familyIDTemp=iclParentTemp(k,1);
                    trackSelInd=indexMapping{
     familyIDTemp}(iclParentTemp(k,2));  
                    iclTrackListTemp=trackIDCache{
     familyIDTemp}{
     trackSelInd}; 
                    iclIndListTemp=treeIndCache{
     familyIDTemp}{
     trackSelInd};
                    if ~isempty(iclTrackListTemp)                     
                        incompabilityListSet=[incompabilityListSet; iclTrackListTemp];
                        incompabilityNodeIDListSet=[incompabilityNodeIDListSet; iclIndListTemp];                    
                    end
                end
                incompabilityListTreeSet(i)=incompabilityListTreeSet(i).set(treeInd(j), incompabilityListSet); 
                incompabilityListTreeNodeIDSet(i)=incompabilityListTreeNodeIDSet(i).set(treeInd(j), incompabilityNodeIDListSet);             
            end
            % find incompatible tracks from other families
            % 从其他族群找到不兼容的轨迹
            sel_observation1=obsTreeSet(i).get(treeInd(j));              
            % check whether the leaf node is a dummy node or not
            % 检测叶节点是否是虚拟节点
            if ~isnan(sel_observation1(7))        
                ind1=cur_observation.x==sel_observation1(1);
                ind2=cur_observation.y==sel_observation1(2);
                iclSel=cell2mat(obsMembership(ind1 & ind2)); % [familyID branchIndex trackID]
                if ~isempty(iclSel)                        
                    incompatibleTrackList=[incompabilityListTreeSet(i).get(treeInd(j)); iclSel(:,[1 3])];
                    incompabilityListTreeSet(i)=incompabilityListTreeSet(i).set(treeInd(j),incompatibleTrackList);   
                    incompatibleTrackList=[incompabilityListTreeNodeIDSet(i).get(treeInd(j)); iclSel(:,1:2)];
                    incompabilityListTreeNodeIDSet(i)=incompabilityListTreeNodeIDSet(i).set(treeInd(j),incompatibleTrackList);   
                end
            end
            % remove redundant tracks from the list 去除多余的轨迹
            incompabilityListSet=incompabilityListTreeSet(i).get(treeInd(j));
            [incompabilityListSet, index]=unique(incompabilityListSet,'rows');
            incompabilityListTreeSet(i)=incompabilityListTreeSet(i).set(treeInd(j),incompabilityListSet);
            incompabilityListSet=incompabilityListTreeNodeIDSet(i).get(treeInd(j));
            incompabilityListTreeNodeIDSet(i)=incompabilityListTreeNodeIDSet(i).set(treeInd(j),incompabilityListSet(index,:));
        end        
    end
end

你可能感兴趣的:(MHT,MHT)