matlab代码实现的dbscan算法转成c++,需要用到pcl

w女汉纸 2017-05-23 04:20:50
vs2013+pcl1.8.0 熟练的人求帮助
...全文
310 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-05-23
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
w女汉纸 2017-05-23
  • 打赏
  • 举报
回复
function [NewData, FourCor] = DBScan(Data) %define params MinPts = 20; R = 0.8; % data pre-process Mapx = 100;% x, y grid Number must be euqal data = Data(:, [1, 2, 3]); ZThreshold = [0 2.5]; data(data(:, 1) > Mapx/2, :) = []; data(data(:, 2) > Mapx/2, :) = []; data(data(:, 3) <= ZThreshold(1), :) = []; data(data(:, 3) >= ZThreshold(2), :) = []; NewData = zeros(size(data, 1), 4); NewData(:, [1 2]) = data(:, [1, 2]) + 0.01.*rand(size(NewData, 1), 2).*data(:, [1, 2]); %ÎÊÌ⣺³öÏÖÁ˺ܶàÏàÍ¬×ø±êµÄµã£¬Æäz×ø±ê²»Í¬£¬µ«Í¶Ó°µ½Æ½ÃæÖ®ºó¶¼ÊÇÒ»ÑùÁË£¡¿¼ÂÇÈËΪ¼ÓÈŶ¯ %NewData ËÄÁзֱðΪ x y cluster visited? %find core points C = 1; TempData = NewData; AllIndex = 1:length(NewData); while ~isempty(TempData)%TempData Ö»ÊÇÒ»²¿·ÖÊý¾Ý£¬NewDataÊÇÈ«²¿Êý¾Ý %j = randi(size(TempData, 1), 1, 1); j = find(TempData(:, 4) == 0, 1); if isempty(j) break; end Dis = (NewData(:, 1) - TempData(j, 1)).^2 + (NewData(:, 2) - TempData(j, 2)).^2; %Dis = sqrt(Dis); Index = find(Dis <= R); Num = length(Index); if Num >= MinPts CorePointFoundFlag = 1; NewData(Index, 3) = C; NewData(Index, 4) = 1; % NewData(j, 3) = C; %²»Óô˾䣬indexÒѾ­°üº¬jµã±¾Éí % NewData(j, 4) = 1; [TempData, AllIndex, NewData] = ExpandCluster(C, Index, MinPts, R, NewData); else CorePointFoundFlag = 0;%δÕÒµ½ºËÐĵ㣬 flag±£³Ö²»±ä % ±ê¼ÇΪÒѾ­·ÃÎÊ TempData(j, 4) = 1; NewData(AllIndex(j), 4) = 1; end C = C + CorePointFoundFlag; end%while % ÖØÐ±àºÅ index = NewData(:, 3) == 0; NewData(index, :) = []; Cluster = sort(unique(NewData(:, 3))); for i = 1:length(Cluster) if i ~= Cluster(i) index = NewData(:, 3) == Cluster(i); NewData(index, 3) = i; end end C = max(NewData(:, 3));%ûÓд˾äµÄ»°£¬52ÐеÄC¿ÉÄܱÈÕæÊµµÄC¶à1 fprintf('\n%.0f clusters have been found!\n', C); FourCor = DrawBox(NewData, C); end%function function [TempData, AllIndex, NewData] = ExpandCluster(C, Index, MinPts, R, data) Neighbors = data(Index, [1, 2]); AllLen = size(Neighbors, 1); Len = 0; while Len ~= AllLen Len = Len + 1;%¿ªÊ¼ for i = Len:AllLen%±éÀúneighbors Dis = (data(:, 1) - Neighbors(i, 1)).^2 + (data(:, 2) - Neighbors(i, 2)).^2; Dis = sqrt(Dis); index = Dis <= R; Num = sum(index); if Num >= MinPts NewNei = data(index, [1, 2]); %Neighbors = union(Neighbors, NewNei(:, [1, 2]), 'rows'); Union = Neighbors(ismember(Neighbors, NewNei,'rows'),:); NewNei = setdiff(NewNei, Union, 'rows'); Neighbors = [Neighbors; NewNei]; % Index = find(data(index, 3) == 0); % data(index(Index), 3) = C; % data(index(Index), 4) = 1; data(index, 3) = C; data(index, 4) = 1; end end % for Len = AllLen; AllLen = size(Neighbors, 1);%ÕâʱºòNeighborsµÄ³¤¶ÈÓ¦¸ÃÒѾ­±äÁË end AllIndex = find(data(:, 3) == 0);%ÉÐδ·ÖÀà TempData = data(AllIndex, :); %TempData = setdiff(temp, data(index, [1, 2]), 'rows');%´ÓtempdataÖÐÈ¥³ýµôC¾ÛÀàµÄµã NewData = data; end function FourCor = DrawBox(NewData, C) SThreshold = 10; Cor = zeros(C, 4); FourCor = zeros(C, 4, 2);%Ëĸöµã£¬ x&y for i = 1:C index = NewData(:, 3) == i; temp = NewData(index, :); Cor(i, :) = [min(temp(:, 1)), min(temp(:, 2)), max(temp(:, 1)), max(temp(:, 2)) ]; FourCor(i, :, :) = FindFourPoints(Cor(i,:));% 4*2 Le = Cor(i, 3) - Cor(i, 1); Wi = Cor(i, 4) - Cor(i, 2); S = Le*Wi; if S >= SThreshold FourCor(i, :, :) = MinBoundingBox(temp, Le, Wi);%ѰÕÒ×îС°üΧºÐ×Ó end end % Le = Cor(:, 3) - Cor(:, 1);% ÓÐminboxÖ®ºóÆäʵÕâ¸ö³¤¿í²»×¼È·ÁË % Wi = Cor(:, 4) - Cor(:, 2); % %figure % ÔÝʱ²»ÔÙ»­Í¼ % plot(NewData(:, 1), NewData(:, 2), 'b.') % hold on % for i = 1:C % Rect(FourCor(i, :, :), Le(i), Wi(i), 'r'); % temp1 = num2str(i); % text(FourCor(i, 2, 1) + 0.2, FourCor(i, 2, 2) + 0.2, temp1, ... % 'Color','red','FontSize',14); % end % axis equal % hold off end function Points = FindFourPoints(Cor)%ÓÉÁ½¸ö¶¥µã¼ÆËã³öÈ«²¿Ëĸö¶¥µã x = Cor([1, 3]); y = Cor([2, 4]); [a, b] = ndgrid(x, y); Points = [a(:) b(:)];%4*2 end function Cor = MinBoundingBox(temp, Le, Wi) %temp ij¸ö´óºÐ×Ó¶ÔÓ¦µÄÊý¾Ýµã n*3 0~100 0~5 temp = temp(:, [1, 2]); n = 10; IF = 0; S = Le*Wi; Cor = zeros(2, 2);% 2µã xy MinCor = zeros(2, 2); C1 = [1,0;0,1]; C3 = C1; for i = 0:n theta = pi*i/(2*n);%»¡¶È R = [cos(theta), sin(theta); -sin(theta), cos(theta)]; C2 = R*C1; Temp = C2*(temp');%ת»» 2*n = 2*2 2*n Temp = Temp';%n*2 Cor = [min(Temp(:, 1)), min(Temp(:, 2)); max(Temp(:, 1)), max(Temp(:, 2))];%2*2 Le = Cor(2, 1) - Cor(1, 1); Wi = Cor(2, 2) - Cor(1, 2); if S > Le*Wi; S = Le* Wi; % Len = Le; % Wid = Wi; MinCor = Cor;%2*2 C3 = C2; IF = 1; end end MinCor = FindFourPoints([MinCor(1,:), MinCor(2,:)]);%4*2 Cor = FindFourPoints([Cor(1,:), Cor(2,:)]);%4*2 MinCor = IF .* (C3\MinCor') + ~IF .* (C2\Cor');%IF ÊDz»ÊÇÓиüУ¬ ÕâÑùC3, Min²ÅÓÐÖµ MinCor = MinCor'; Cor = MinCor; end function Rect(Points, Le, Wi, Color) BoxThreshold = 0.5; if (Le <= BoxThreshold || Wi <= BoxThreshold ) return; end Points = squeeze(Points);%4*2 plot3([Points(1, 1), Points(2, 1)], [Points(1, 2), Points(2, 2)],... [0, 0], Color); hold on plot3([Points(1, 1), Points(3, 1)], [Points(1, 2), Points(3, 2)],... [0, 0], Color); hold on plot3([Points(2, 1), Points(4, 1)], [Points(2, 2), Points(4, 2)],... [0, 0], Color); hold on plot3([Points(3, 1), Points(4, 1)], [Points(3, 2), Points(4, 2)],... [0, 0], Color); hold on end

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧