MHT|MHT代码阅读(2)
MHT代码阅读(2)
2. updateICL
2.1 代码实现
- 补充
- 在MHT.m文件中
- obsTreeSet(观测树),stateTreeSet(状态树),scoreTreeSet(得分树),idTreeSet(id树),activeTreeSet(活跃树)
- 所有的其他集合都与这五个原始集合相关
- cell生成元胞数组
- 在MHT.m文件中
- ICL=incompabilityList,不兼容轨迹集合
- 当轨迹有共同观察时,称为不兼容
- 共享观测的轨迹被定义为不兼容的,并且每次扫描都保留不兼容轨迹的记录。当轨迹被删除以及根据当前扫描的观察结果形成新轨迹时,该记录会更新。
- 聚类的过程是将通过共同观察链接起来的所有轨迹的集合。
- 初始化不兼容轨迹集合
- 【MHT|MHT代码阅读(2)】将树信息存储在表中,因为现在树操作很慢
- Cache-缓存
- 初始化treeIndCache、trackIDCache、ICLCache、indexMapping
- 删除不活跃的轨迹
文章图片
- 用到obsMembership,在formTrackFamily中出现
- obsMembership{i}=[obsMembership{i}; [familyID 1 trackID]]
- 寻找不兼容航迹
- 查找来自同一族群的不兼容轨迹。 这在创建新族时执行一次。
- 从父节点找到不兼容的轨迹
- 从其他族群找到不兼容的轨迹
- 检测叶节点是否是虚拟节点
- 去除多余的轨迹
%%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
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 上班后阅读开始变成一件奢侈的事
- 历史教学书籍
- 绘本讲师训练营【24期】14/21阅读原创《小黑鱼》
- 21天|21天|M&M《见识》04
- 绘本讲师训练营7期9/21阅读原创《蜗牛屋|绘本讲师训练营7期9/21阅读原创《蜗牛屋 》
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 桂妃研读社|桂妃研读社|D124|如何有效阅读一本书 Day1