簡體   English   中英

選擇矩陣中距離另一個點30米的所有點

[英]Select all points in a matrix within 30m of another point

因此,如果你看看我的其他帖子,我建立一個可以在森林中收集數據並將其粘貼在地圖上的機器人就不足為奇了。 我們有能夠檢測樹中心和樹干直徑的算法,並且可以將它們粘貼在笛卡爾XY平面上。

我們計划使用某些“關鍵”樹作為本地化機器人的自然地標,使用三角測量和三邊測量等方法,但使用Matlab進行編程並保持數據的直接性和高效性變得越來越困難。

是否有一種技術可以設置點陣的數組或矩陣? 假設我有超過1公里(1000米)存儲的1000棵樹,有沒有辦法說,只選擇我當前位置半徑30米范圍內的點,只能使用那些?

我只是使用GIS,但我在Matlab中這樣做,我不知道任何用於Matlab的GIS插件。

我忘了提一下,這段代碼正在上線,這意味着它正在用於實時執行的機器人。 我不知道,當地圖增長到幾英里時,使用不同的數據結構將有助於或者如果計算到隨機點的每個距離都是空間數據庫將要做的事情。

我正在考慮將樹的數組鏡像為兩個數組,一個按X排序,另一個按Y排序。然后冒泡排序以確定其中的30米范圍。 我對兩個數組,X和Y做同樣的事情,然后有第三個交叉鏈接表,它將選擇各個值。 但我不知道,這是什么叫,如何編程,我相信有人已經有了,所以我不想重新發明輪子。

笛卡爾平面
GIS

您正在尋找像四叉樹kd樹這樣的空間數據庫。 我在這里這里找到了兩個kd-tree實現,但是沒有找到任何用於Matlab的四叉樹實現。

計算所有距離和掃描的簡單解決方案似乎幾乎是瞬間完成的:

lim = 1;
num_trees = 1000;

trees = randn(num_trees,2); %# list of trees as Nx2 matrix
cur = randn(1,2); %# current point as 1x2 vector
dists = hypot(trees(:,1) - cur(1), trees(:,2) - cur(2)); %# distance from all trees to current point
nearby = tree_ary((dists <= lim),:); %# find the nearby trees, pull them from the original matrix

在1.2 GHz的機器上,我可以在<0.4秒內處理100萬棵樹(1個MTree?)。

您是否直接在機器人上運行Matlab代碼? 你在使用Real-Time Workshop嗎? 如果您需要將此轉化為C,你可以替換hypotsqr(trees[i].x - pos.x) + sqr(trees[i].y - pos.y)並更換與限制檢查< lim^2 如果你真的只需要處理1 KTree,我不知道實現更復雜的數據結構是值得的。

您可以使用CART2POL將笛卡爾坐標轉換為極坐標。 然后選擇一定范圍內的點將是直線前進的。

[THETA,RHO] = cart2pol(X-X0,Y-Y0);
selected =  RHO < 30;

其中X0,Y0是當前位置的坐標。

我的猜測是樹木大致均勻地分布在森林中。 如果是這種情況,只需將30x30(或15x15)網格塊作為哈希鍵用於閉合哈希表 查找與搜索圈相交的所有塊的鍵,並檢查從該鍵開始的所有哈希條目,直到其中一個被標記為其“桶”中的最后一個。

0---------10---------20---------30--------40---------50----- address # line
(0,0)     (0,30)     (0,60)     (30,0)    (30,30)    (30,60) hash key values

(1,3) (10,15) (3,46) (24,9.) (23,65.) (15,55.) tree coordinates + "." flag

例如,要獲取(0,0)...(30,30)中的樹,將(0,0)映射到地址0並讀取條目(1,3),(10,15),拒絕(3,46) )因為它超出范圍,讀取(24,9)並停止,因為它被標記為該扇區中的最后一棵樹。

要獲取(0,60)...(30,90)中的樹,請將地圖(0,60)映射到地址20.跳過(24,9),讀取(23,65),然后停止,因為它是最后一個。

這將是非常有效的內存,因為它避免了存儲指針,否則這些指針相對於實際數據而言將具有相當大的尺寸。 然而,封閉散列需要留下一些空白空間。

該圖示不是“按比例縮放”,因為實際上在散列鍵標記之間存在多個條目的空間。 所以你不應該跳過任何條目,除非在本地前面的扇區中有比平均值更多的樹。

這確實使用哈希沖突,因此它不像哈希函數那樣隨機。 (並非每個條目都對應一個不同的哈希值。)但是,由於森林的密集區域通常是相鄰的,您應該將扇區的映射隨機化為“桶”,這樣一個給定的密集扇區有望溢出到一個密度較小的區域,或下一個,或下一個。

另外,存在空扇區和終止迭代的問題。 您可以在每個扇區中插入一個虛擬樹以將其標記為空,或者其他一些簡單的黑客。

很抱歉很長的解釋。 這種事情比文檔更容易實現。 但性能和足跡可以很好。

使用某種空間分區的數據結構。 一個簡單的解決方案是簡單地創建一個包含30米x 30米區域內所有對象的二維列表。 最糟糕的情況是,您只需要與其中四個列表中的對象進行比較。

還可以使用許多更復雜(也可能是有益的)解決方案 - 比如雙樹更復雜(雖然不是很多),但可以獲得更佳的性能(特別是在物體密度變化的情況下)相當)。

您可以在matlab中查看voronoi圖支持:

http://www.mathworks.com/access/helpdesk/help/techdoc/ref/voronoi.html

如果你將voronoi多邊形基於關鍵樹,並將相鄰樹聚類成那些多邊形,那將通過接近度划分搜索空間(找到給定非關鍵點的封閉多邊形很快),但最終你要去通過畢達哥拉斯或三角形來計算非關鍵距離的計算關鍵並進行比較。

對於幾千點(樹木),如果你有一個合理的處理器,蠻力可能足夠快。 計算樹中每個其他樹的距離,然后選擇30'內的樹。 這與將所有樹放在同一個voronoi多邊形中相同。

自從我在GIS工作了幾年之后,我發現了以下有用的東西:'計算幾何在C'約瑟夫O Rourke,ISBN 0-521-44592-2平裝本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM