MHT|MHT代码阅读(2)

MHT代码阅读(2) 2. updateICL 2.1 代码实现

  1. 补充
    • 在MHT.m文件中
      • obsTreeSet(观测树),stateTreeSet(状态树),scoreTreeSet(得分树),idTreeSet(id树),activeTreeSet(活跃树)
      • 所有的其他集合都与这五个原始集合相关
    • cell生成元胞数组
  2. ICL=incompabilityList,不兼容轨迹集合
    • 当轨迹有共同观察时,称为不兼容
    • 共享观测的轨迹被定义为不兼容的,并且每次扫描都保留不兼容轨迹的记录。当轨迹被删除以及根据当前扫描的观察结果形成新轨迹时,该记录会更新。
    • 聚类的过程是将通过共同观察链接起来的所有轨迹的集合。
  3. 初始化不兼容轨迹集合
  4. 【MHT|MHT代码阅读(2)】将树信息存储在表中,因为现在树操作很慢
    • Cache-缓存
    • 初始化treeIndCache、trackIDCache、ICLCache、indexMapping
  5. 删除不活跃的轨迹
    MHT|MHT代码阅读(2)
    文章图片

    • 用到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

    推荐阅读