最有效的方式查找数组中的值。
12个视图(30天)
显示旧的评论
我有一个数组(一种查找数组生成),我有8列和大约400行。在每一行的第一个四个值代表了边界(y1, x2, y2和x1)矩形区域的平面。最后四值是整数我想访问如果查询点区域内所描述的前四个值。矩形区域的完全覆盖飞机到一定限度,不重叠,但他们不定期/结构化。
如果我有1000万分(由x和y矢量和矢量),我想找到这些四个整数(在列8)对应于他们的地区,最快的方法是什么呢?改变我的方式查找数组代表了数据没有禁区,如果它有助于使过程更快。
我试过以下,这是缓慢的,似乎很低效和休息区域之间的边界上的点是:
QueryPoints = (X, Y);% 10000000 x 2向量为查询点。
n =长度(X);%确定数量的查询点
SearchIndex =所有([Y - X - Y X] > =排列([IndexList (: 1) -IndexList (: 2:3) IndexList (:, 4)], [3 2 1]), 2);
myIntegers = 0 (n, 4);
为i = 1: n
myIntegers(我)= IndexList (SearchIndex(我1:),8);% 10000000 x 4向量与整数的集合对应的坐标
结束
谢谢。
接受的答案
约翰D 'Errico
2023年3月17日
编辑:约翰D 'Errico
2023年3月17日
疼我的头看到这订购:(y1, x2, y2和x1)。叹息。为什么?随你的船,我猜。
我不会使用一个循环。甚至没有关闭。即使是远程。我也不会是测试每一个矩形,因为您的代码。相反,我将寻找一种方法来解决这个使用现有的高效的代码为解决这个问题而设计的。
如果矩形区域完全砖平面区域,但不重叠,我会首先把每个矩形分成两个三角形。结果将是一个三角地区。所以我现在可能创建一个三角的三角形。不要使用德劳内。(我不知道你的问题是凸。)你已经知道矩形。这意味着你已经可以直接计算三角。
帮助三角测量
方法三角测量
正如您可以看到的,三角pointLocation方法。我可能会使用。
帮助三角/ pointLocation
之前我做了太多,我可能看起来,看看其他的工具,例如,tsearch可能更快。
例如:
n = 21;
(X, Y) = ndgrid (linspace (0, 1, n));% 400矩形
XYgrid = [X (:), Y (:));
(ri, rj) = ndgrid (1: n - 1);
皮= sub2ind (n, n, ri (:), rj (:));
三=[[皮,皮+ 1,皮+ n];[皮+ n + 1,皮+ 1,皮+ n]];
triang =三角(三,X (:), Y (:));
rectid =(皮,皮);%每个三角形映射到它来自原来的矩形
%,生成1 e7点
xytest =兰德(1 e7, 2);
抽搐
triloc = pointLocation (triang xytest);
rectloc = rectid (triloc);
toc
7秒的在线工具,(我的电脑总是更快运行时自己的MATLAB的副本。只有1.5秒在我自己的MATLAB的副本。)似乎是合理的定位1 e7点。事实上,当然,我可以做得更好了解的实际布局网格。但是你告诉我们,你的矩形不平凡地安排我在这个例子。和pointLocation不应该关心。