我有一个非常长的项目(200K-800K,3)的x,y,z坐标列表,我需要搜索并查找到特定点的最近项目 - 此最终列表始终至少有1个项目,通常不到10项。
我已经尝试了一些简单的搜索方法来查找此列表,但我已经达到了一定的限制 - 这是我迄今为止最好的两种方法:
xInd = find(PositionsList(:,1) > (searchPoint(i,1) - searchRad) & PositionsList(:,1) < (searchPoint(i,1) + searchRad));
yInd = find(PositionsList(xInd,2) > (searchPoint(i,2) - searchRad) & PositionsList(xInd,2) < (searchPoint(i,2) + searchRad));
xyInd = xInd(yInd);
zInd = find(PositionsList(xyInd,3) > (searchPoint(i,3) - searchRad) & PositionsList(xyInd,3) < (searchPoint(i,3) + searchRad));
xyzInd = xyInd(zInd);
neighbours = sqrt(sum(bsxfun(@minus,searchPoint(i,:),PositionsList).^2,2)) <= searchRad;
xyzInd = find(neighbours == 1);
xInd = PositionsList(:,1) > (searchPoint(i,1) - searchRad) & PositionsList(:,1) < (searchPoint(i,1) + searchRad);
newlist = PositionsList(xInd==1,:);
yzInd = newlist(:,2) > (searchPoint(i,2) - searchRad) & newlist(:,2) < (searchPoint(i,2) + searchRad)...
& newlist(:,3) > (searchPoint(i,3) - searchRad) & newlist(:,3) < (searchPoint(i,3) + searchRad);
xyzInd = newlist(yzInd==1,:);
对于我的数据方法1更快 - 对于20000个粒子的小列表,它运行在大约25s,而方法2运行大约170s,但方法2稍微更准确 - 它有可疑的邻居(搜索边缘的异常值)区域)更不常见。
我的代码将此搜索调用了几千次,因此我希望尽可能多地节省时间 - 它目前占我运行时间的85%左右。我已经读过mex实现可能会更快,但我不熟悉mex。我也尝试了第三种逻辑索引方法而不是查找,但它在35秒时速度较慢。
有人可以帮助您更快地进行此搜索吗?也许是mex函数?
答案 0 :(得分:0)
根据obchardon建议,我查看了用于搜索的k-d树,并在与我的数据进行文件交换时发现以下kd-tree for matlab,并开始使用我的数据进行测试。 现在,我可以在5s以内完成500K坐标的搜索,与之前的20k坐标的最佳25s相比。巨大的进步。
唯一的缺点是它返回的顺序邻居似乎是随机的,这意味着我有一些轻微的&#34;爱抚&#34;要做的结果,但节省了时间,这是可以接受的。
感谢您提出的好建议!!