-1から1を範囲に持つ3次元データを100万個生成し、pointsとします。
points = RandomReal[{-1, 1}, {100000000, 3}];
点集合pointsに対し、点{0,0,0}から最も近い点10個を選びます。
計算内部では連想形式でデータを保持し、キー"Element"は値を、キー"Index"は点集合内のインデックスを、キー"Distance"は実際の距離を保持します。
Timing[
Nearest[points -> All, {0, 0, 0}, 10] ]
距離情報だけを取り出します。
Timing[
Nearest[points -> "Distance", {0, 0, 0}, 10]]
インデックス情報のみを取り出します。
Timing[
Nearest[points ->"Index", {0, 0, 0}, 10] ]
距離0.02以内にあるすべての点のインデックスのみを取り出します。
Nearest[points -> "Index", {0, 0, 0}, {All, 0.02}]
size = 1000000;
Timing[
(*Field=<オブジェクト\[Rule]座標の連想集合>*)
Field = MapThread[Rule, {
(*オブジェクトIDの集合*)
IDS = Table[Unique["ga"], {size}],
(*対応する座標の集合 *)
RandomReal[{-1, 1}, {size, 3}]}
];
(*Ruleのリストに関し直接連想化するより2段階にばらした方が高速*)
Field = Association[Field];]
findNeighbors[field_, ids_, n_, dist_] :=
(*
入力:field 場Field
ids オブジェクトの集合IDS
n 探索サイズ
dist 指定距離
出力:指定距離内のオブジェクトリスト
*)
Module[{points, group, centers, neighbors},
points = Values[field];
(*ここではランダムにn個選択*)
group = RandomChoice[ids, n];
centers = field[#] & /@ group;
neighbors =
Nearest[points -> "Index", centers, {All, dist}];
(*Nearestは複数の拠点から近傍を探索することが可能*)
ids[[#]] & /@ neighbors]
Timing[
(*10000箇所拠点を決め、各拠点から距離0.02以内にあるオブジェクトIDのリストを求める*)
neighborList = findNeighbors[Field, IDS, 10000, 0.02];]
neighborList // Short