MHT代码阅读(3)
MHT代码阅读(3)
3. updateClusters
3.1 论文内容
聚类的过程是将通过共同观察链接起来的所有轨迹的集合。共享观测的轨迹被定义为不兼容的,并且每次扫描都保留不兼容轨迹的记录。当轨迹被删除以及根据当前扫描的观察结果形成新轨迹时,该记录会更新。
一个集群可以包括不直接共享观测但都与第三个跟踪共享观测的轨迹。因此,如果轨道 1 与轨道 2 共享一个观测值,而轨道 2 与轨道 3 共享另一个观测值,则所有三个轨道都在同一个集群中。标准算法可用于聚类。
具有大量轨道的集群的形成可能导致假设形成所需的时间量无法接受。因此,为了维护包含不超过数百个轨道的集群,采用了稍后讨论的几种技术。
聚类的结果是相互作用的轨迹列表(通过共同观察链接)。这些轨迹按 LLR(前面讨论的评分函数)的顺序排列。下一步是形成兼容轨道的假设。
3.2 代码阅读
每个树节点都可以通过它的 familyID 和 trackID 访问
- 初始化 familyNo 和 other_param.currentTrackNo
- 利用cell函数初始化 clusterFamilyList 和 clusterFamilyIndex
- %cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
- %利用函数cell() 可以创建一个元胞数组,还可以规定其大小。cell(familyNo,1)表示 行数=familyNo,列数=1
- 利用zeros函数初始化familyClusters
进入循环,得到 ICL_sel 和 clusterFamilyList{i}
- %sel为select的简写?
- %unique筛除向量中的重复值,产生的结果按升序排列
进入循环得到 clusterFamilyIndex{i}
进入while循环,得到 familyClusters(clusterFamilyIndex{i})=w
ICL_clusters=cell(w,1); clusters=cell(w,1);
进入循环,更新 ICL_sel 、ICL_clusters{k} 、clusters{k}
- %cellfun将函数用于元胞数组中的每个cell。isempty(A) ;判断A是否为空,如果为空,结果为1,否则为0.
计算每个簇中的轨道数
3.3 代码附录
function [clusters,ICL_clusters,other_param]=updateClusters...(incompabilityListTreeSet, incompabilityListTreeNodeIDSet, ...activeTreeSet, other_param)%%% Each tree node can be accessed by its familyID and trackIDfamilyNo=length(incompabilityListTreeSet);other_param.currentTrackNo=0;if familyNo == 0clusters=[];ICL_clusters=[];returnend%cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体clusterFamilyList=cell(familyNo,1);%利用函数cell() 可以创建一个元胞数组,还可以规定其大小。行数=familyNo,列数=1clusterFamilyIndex=cell(familyNo,1);%返回一个familyNo*1的0矩阵familyClusters=zeros(familyNo,1);for i=1:familyNo treeInd=findleaves(incompabilityListTreeSet(i)); %sel为select的简写?ICL_sel=[];for j=treeIndif activeTreeSet(i).get(j) ~= 1continue;endICL_sel_tmp=incompabilityListTreeNodeIDSet(i).get(j);ICL_sel=[ICL_sel; ICL_sel_tmp(:,1)]; end%unique筛除向量中的重复值,产生的结果按升序排列ICL_sel=unique(ICL_sel); clusterFamilyList{i}=ICL_sel; endfor i=1:length(clusterFamilyList)ICL_sel=clusterFamilyList{i};clusterFamilyIndex{i}=i;if i ~= length(clusterFamilyList)for j=i+1:length(clusterFamilyList) ICL_sel2=clusterFamilyList{j};for k=1:length(ICL_sel2)if sum(ICL_sel == ICL_sel2(k)) ~= 0clusterFamilyIndex{i}=[clusterFamilyIndex{i}; j];break;endend endendendw=0;todolist=1:familyNo;%~isempty(A) ;表示将 isempty(A) 的结果取反,也就是说如果A为空,结果为0,否则为1。while ~isempty(todolist)w=w+1;i=todolist(1);cl_index=clusterFamilyIndex{i};cl_index=cl_index';for j=cl_indexif i == jcontinue;end clusterFamilyIndex{i}=[clusterFamilyIndex{i}; clusterFamilyIndex{j}]; clusterFamilyIndex{j}=[];endclusterFamilyIndex{i}=unique(clusterFamilyIndex{i});todolist=setdiff(todolist,cl_index'); if sum(familyClusters(clusterFamilyIndex{i})) == 0familyClusters(clusterFamilyIndex{i})=w;else cl_parent=find(familyClusters(clusterFamilyIndex{i})~=0);clusterNums=unique(familyClusters(clusterFamilyIndex{i}(cl_parent)));for k=1:length(clusterNums)indSel=find(familyClusters==clusterNums(k));familyClusters(indSel)=w; endfamilyClusters(clusterFamilyIndex{i})=w;endendICL_clusters=cell(w,1);clusters=cell(w,1);for k=1:max(familyClusters)ICL_sel=[]; ICL_Ind_sel=[];indSel=find(familyClusters == k);indSel=indSel';for i=indSeltreeInd=findleaves(incompabilityListTreeSet(i)); for j=treeIndif activeTreeSet(i).get(j) ~= 1continue;endICL_sel_tmp=incompabilityListTreeSet(i).get(j);ICL_sel=[ICL_sel; ICL_sel_tmp(:,2)];ICL_Ind_sel=[ICL_Ind_sel; [i j]]; endendICL_sel=unique(ICL_sel);ICL_clusters{k}=ICL_sel;clusters{k}=ICL_Ind_sel;end%cellfun将函数用于元胞数组中的每个cell。isempty(A) ;判断A是否为空,如果为空,结果为1,否则为0.ICL_clusters(cellfun('isempty',ICL_clusters))=[]; clusters(cellfun('isempty',clusters))=[]; % count the number of tracks in each clusterother_param.currentTrackNo=zeros(length(clusters),1);for i=1:length(clusters)%其中r=size(A,1)该语句返回的是矩阵A的行数, c=size(A,2) 该语句返回的是矩阵A的列数other_param.currentTrackNo(i)=size(clusters{i},1);if size(clusters{i},1) ~= size(ICL_clusters{i},1)error('error');endend
end
MHT代码阅读(3)相关推荐
- MHT代码阅读(1)
MHT代码阅读(1) 文章目录 MHT代码阅读(1) 1. FormTrackFamily 1.1 整体思路 1.2 代码实现 1.3 附录代码 1. FormTrackFamily 1.1 整体思路 ...
- MHT代码阅读(2)
MHT代码阅读(2) 2. updateICL 2.1 代码实现 补充 在MHT.m文件中 obsTreeSet(观测树),stateTreeSet(状态树),scoreTreeSet(得分树),id ...
- MHT代码阅读(4)
MHT代码阅读(4) 4. generateGlobalHypothesis 4.1 论文内容 形成多个轨迹假设来表示场景中的多个目标.假设被定义为一组一致(兼容)的轨道,因为在给定假设中没有两条轨道 ...
- ORB_SLAM2代码阅读(5)——Bundle Adjustment
ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...
- ORB_SLAM2代码阅读(3)——LocalMapping线程
ORB_SLAM2代码阅读(3)--LocalMapping线程 1.说明 2.简介 3.处理关键帧 4. 地图点剔除 5. 创建新的地图点 6.相邻搜索 6.剔除冗余关键帧 1.说明 本文介绍ORB ...
- ORB_SLAM2代码阅读(4)——LoopClosing线程
ORB_SLAM2代码阅读(4)--LoopClosing线程 1.说明 2.简介 3.检测回环 4.计算Sim3 4.1 为什么在进行回环检测的时候需要计算相似变换矩阵,而不是等距变换? 4.2 累 ...
- ORB_SLAM2代码阅读(2)——tracking线程
ORB_SLAM2代码阅读(2)--Tracking线程 1. 说明 2. 简介 2.1 Tracking 流程 2.2 Tracking 线程的二三四 2.2.1 Tracking 线程的二种模式 ...
- ORB_SLAM2代码阅读(1)——系统入口
ORB_SLAM2代码阅读(1)--系统简介 1.说明 2.简介 3.stereo_kitti.cc 4.SLAM系统文件(System.cc) 4.1 构造函数System() 4.2 TrackS ...
- 深度学习项目代码阅读建议
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习实验室 犹豫很久要不要把读代码这个事情专门挑出来写 ...
最新文章
- html table 表格 行合并 列合并
- 网络营销推广软件浅析网络优化时该如何更好的判断友链的质量?
- <java并发编程实践>读书笔记二
- java课程课后作业04之动手动脑
- sas数据导入终极汇总-之一
- java webservice ip_通过Web Service实现IP地址查询功能的示例
- 计算机网络专业以后装网线,宽带以后都不用装了? 将会被5G取代?
- PAT 乙级 1043. 输出PATest(20) Java版
- 【自爆系列】浅谈我前端开发的那些糗事
- 亲民地理第39期-佛山(3)千灯湖
- MyBatis防止SQL注入的方法
- 支持ipv6路由器有什么优点?路由器应用了哪些技术?
- NTDETECT.COM 丢失(NTDETECT failed)解决方法
- html语言制作带样式的表格,CSS实现的清爽、漂亮的表格样式分享
- ubuntu 18.04 开启rc.local
- [转载]计算机科学与技术学生学习基础材料参考
- linux恢复安卓数据,安卓数据恢复2 - ranfs的个人空间 - OSCHINA - 中文开源技术交流社区...
- 无人机航线规划软件[航线通]
- TOJ 4074 Running Laps -- 树状数组
- codeforces Hello 2021
热门文章
- php系统一直重新安装,系统重装失败无法进入系统怎么办
- 一站式购车平台“买车车”落地,年内布局百家门店...
- 解除Win10网速限制
- QNAP(威联通)每天自动通过邮件上报外网IP
- 《Python编程快速上手,让繁琐工作自动化》读书笔记
- Python的数据类型3-列表list
- Apache Geode 2.11 运行Geode服务器进程
- 【时空智友】表单开发工具的疑问
- python执行pyc文件_Python 编译:code对象 与 pyc文件
- Intertek的环保解决方案-绿叶认证