rangesearch
入力データを使用して指定距離内の近傍をすべて探索
説明
例
各 Y 点のユークリッド距離 1.5 内にある X 点を求めます。X と Y はどちらも、5 次元正規分布変数の標本です。
rng('default') % For reproducibility X = randn(100,5); Y = randn(10,5); [Idx,D] = rangesearch(X,Y,1.5)
Idx=10×1 cell array
{[ 25 62 33 99 87 92 16]}
{[ 92 25]}
{[ 93 42 31 73 60 28 78 83 48 89 85]}
{[ 92 41]}
{[44 7 28 78 75 42 69 31 1 26 83 93]}
{[ 15 31 89 41 27 17 29 60 34]}
{[ 89]}
{1×0 double }
{1×0 double }
{1×0 double }
D=10×1 cell array
{[ 0.9546 1.0987 1.2730 1.3981 1.4140 1.4249 1.4822]}
{[ 1.4203 1.4558]}
{[ 0.7114 0.7552 1.0081 1.1324 1.1424 1.1637 1.2108 1.3824 1.3944 1.4116 1.4605]}
{[ 1.1244 1.4672]}
{[0.7863 0.9326 0.9773 1.0508 1.1722 1.1934 1.3218 1.3623 1.3869 1.3919 1.4814 1.4978]}
{[ 1.2824 1.2843 1.3342 1.3469 1.4154 1.4237 1.4625 1.4626 1.4744]}
{[ 1.1739]}
{1×0 double }
{1×0 double }
{1×0 double }
このケースでは、Y の最後の 3 つの点は、X のどの点からも距離が 1.5 より離れています。X(89,:) は Y(7,:) から距離が 1.1739 離れており、他の X の点はすべて Y(7,:) からの距離が 1.5 より離れています。X には、Y(5,:) からの距離が 1.5 以内である点が 12 個含まれています。
3 つの異なる多変量正規分布のそれぞれから、5000 個のランダムな点を生成します。無作為に生成した点が 3 つの異なるクラスターを形成する可能性が高くなるように、分布の平均をシフトします。
rng('default') % For reproducibility N = 5000; dist = 10; X = [mvnrnd([0 0],eye(2),N); mvnrnd(dist*[1 1],eye(2),N); mvnrnd(dist*[-1 -1],eye(2),N)];
X 内の各点について、その点から半径 dist 以内にある X 内の点を求めます。計算を高速化するため、最近傍のインデックスを並べ替えないように指定します。X 内の最初の点を選択し、その最近傍を求めます。
Idx = rangesearch(X,X,dist,'SortIndices',false);
x = X(1,:);
nearestPoints = X(Idx{1},:);x の最近傍ではない X 内の値を求めます。これらの点をある色で、x の最近傍を別の色で表示します。黒で塗りつぶした円で点 x にラベルを付けます。
nonNearestIdx = true(size(X,1),1);
nonNearestIdx(Idx{1}) = false;
scatter(X(nonNearestIdx,1),X(nonNearestIdx,2))
hold on
scatter(nearestPoints(:,1),nearestPoints(:,2))
scatter(x(1),x(2),'black','filled')
hold off
年齢および体重が Y 内の患者に対して特定の範囲内にある patients データ セット内の患者を求めます。
patients データ セットを読み込みます。Age の値の単位は年、Weight の値の単位はポンドです。
load patients X = [Age Weight]; Y = [20 162; 30 169; 40 168]; % New patients
年齢と体重に関する患者間の距離を決定するカスタム距離関数 distfun を作成します。distfun に従うと、たとえば、年齢が 1 年離れており体重が同じである 2 人の患者は、距離が 1 単位離れています。同様に、年齢が同じであり体重が 5 ポンド離れている 2 人の患者も、距離が 1 単位離れています。
type distfun.m % Display contents of distfun.m file
function D2 = distfun(ZI,ZJ) ageDifference = abs(ZI(1)-ZJ(:,1)); weightDifference = abs(ZI(2)-ZJ(:,2)); D2 = ageDifference + 0.2*weightDifference; end
メモ: この例の右上にあるボタンをクリックして MATLAB® で例を開くと、MATLAB は例のフォルダーを開きます。このフォルダーには、関数のファイル distfun.m が含まれています。
Y 内の患者に対する距離が 2 以内である X 内の患者を求めます。
[Idx,D] = rangesearch(X,Y,2,'Distance',@distfun)Idx=3×1 cell array
{1×0 double}
{1×0 double}
{[ 41]}
D=3×1 cell array
{1×0 double}
{1×0 double}
{[ 1.8000]}
距離が 2 以内である患者が X 内に存在するのは、Y 内の 3 番目の患者だけです。
年齢が 40、体重が 168 である患者に最も近い X 内の患者の Age と Weight の値を表示します。
X(Idx{3},:)ans = 1×2
39 164
入力引数
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。
例: rangesearch(X,Y,1.4,'Distance','seuclidean','Scale',iqr(X)) は、X の四分位数間範囲によってスケーリングされた、標準化されたユークリッド距離を使用して、Y 内の各観測値からの距離が 1.4 以内である X 内の観測値をすべて求めるよう指定します。
最近傍探索法。'NSMethod' と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。
| 値 | 説明 |
|---|---|
'kdtree' | Kd 木を作成および使用して最近傍を探索します。
|
'exhaustive' | 網羅的探索アルゴリズムを使用します。最近傍点を求めるため、X のすべての点から Y の各点までの距離が計算されます。 |
X の列数が 10 以下であり、X がスパースではなく、距離計量が 'kdtree' で有効な尺度のいずれかである場合、'kdtree' が既定値になります。それ以外の場合、既定値は 'exhaustive' です。
例: 'NSMethod','exhaustive'
rangesearch が使用する距離計量。'Distance' と次の表のいずれかの値から構成されるコンマ区切りのペアとして指定します。
| 値 | 説明 |
|---|---|
'euclidean' | ユークリッド距離。 |
'seuclidean' | 標準化されたユークリッド距離。X の行とクエリ点の間の各座標差は、X から計算される標準偏差 std(X,'omitnan') の対応する要素で除算することによりスケーリングされます。他のスケーリングを指定するには、名前と値のペアの引数 'Scale' を使用します。 |
'mahalanobis' | 正定値共分散行列 C を使用して計算される、マハラノビス距離。C の既定値は X の標本共分散行列であり、cov(X,'omitrows') によって計算されます。C に別の値を指定するには、'Cov' 名前と値のペアの引数を使用します。 |
'cityblock' | 市街地距離。 |
'minkowski' | ミンコフスキー距離。既定の指数は 2 です。別の指数を指定するには、'P' 名前と値のペアの引数を使用します。 |
'chebychev' | チェビシェフ距離 (最大座標差)。 |
'cosine' | 1 から、ベクトルとして扱われる観測間の夾角の余弦を引きます。 |
'correlation' | 1 から、一連の値として扱われる観測間の標本線形相関係数を引きます。 |
'hamming' | 異なる座標の比率を示すハミング距離。 |
'jaccard' | 1 から、ジャカード係数 (異なる非ゼロ座標の比率) を引いた値。 |
'spearman' | 1 から、観測値間の標本スピアマンの順位相関 (値の系列として扱われる) を引いた値。 |
@ | カスタム距離関数のハンドル。距離関数の形式は次のようになります。 function D2 = distfun(ZI,ZJ) % calculation of distance ...
|
詳細は、距離計量を参照してください。
例: 'Distance','minkowski'
ミンコフスキー距離計量の指数。'P' と正のスカラー値をコンマで区切って指定します。この引数は、'Distance' が 'minkowski' である場合のみ有効です。
例: 'P',4
データ型: single | double
マハラノビス距離計量の共分散行列。'Cov' と正定値行列から構成されるコンマ区切りのペアとして指定します。この引数は、'Distance' が 'mahalanobis' である場合のみ有効です。
例: 'Cov',eye(4)
データ型: single | double
標準化されたユークリッド距離計量のスケール パラメーター値。'Scale' と非負のベクトルから構成されるコンマ区切りのペアとして指定します。Scale の長さは X の列数と同じです。X の行とクエリ点の間の各座標差は、Scale の対応する要素でスケーリングされます。この引数は、'Distance' が 'seuclidean' である場合のみ有効です。
例: 'Scale',iqr(X)
データ型: single | double
Kd 木の葉ノードにおけるデータ点の最大数。'BucketSize' と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。この引数は、NSMethod が 'kdtree' である場合のみ有効です。
例: 'BucketSize',20
データ型: single | double
出力引数
最近傍点のインデックス。数値ベクトルの cell 配列として返されます。
Idx は my 行 1 列の cell 配列です。my は Y の行数です。ベクトル Idx{j} には、Y(j,:) に対する距離が r 以下である X 内の点 (行) のインデックスが格納されます。SortIndices が true である場合、rangesearch はインデックスを距離の昇順で並べ替えます。
クエリ点に対する最近傍点の距離。数値ベクトルの cell 配列として返されます。
D は my 行 1 列の cell 配列です。my は Y の行数です。D{j} には、X(Idx{j},:) 内の点 (行) と Y(j,:) の間の距離の値が格納されます。SortIndices が true である場合、rangesearch は距離を昇順で並べ替えます。
ヒント
アルゴリズム
kd 木アルゴリズムの概要については、Kd 木を使用した k 最近傍探索を参照してください。
代替機能
関数 rangesearch の名前と値のペアの引数 'NSMethod' を適切な値 (網羅的探索アルゴリズムの場合は 'exhaustive'、Kd 木アルゴリズムの場合は 'kdtree') に設定した場合、オブジェクト関数 rangesearch を使用して距離探索を実行することにより得られる結果と同じ探索結果になります。関数 rangesearch とは異なり、オブジェクト関数 rangesearch では ExhaustiveSearcher または KDTreeSearcher モデル オブジェクトが必要です。
拡張機能
rangesearch 関数は、tall 配列を次の使用上の注意事項および制限事項付きでサポートします。
Xが tall 配列の場合、Yを tall 配列にすることはできません。同様に、Yが tall 配列の場合、Xを tall 配列にすることはできません。
詳細は、tall 配列を参照してください。
使用上の注意および制限:
コード生成では、
Xの列数が 7 より多い場合、名前と値のペアの引数'NSMethod'の既定値は'exhaustive'です。名前と値のペアの引数
'Distance'の値はコンパイル時の定数でなければならず、カスタム距離関数にすることはできません。名前と値のペアの引数
'SortIndices'はサポートされていません。出力引数は常に並べ替えられます。名前と値の引数に含まれる名前はコンパイル時の定数でなければなりません。たとえば、生成されたコードでミンコフスキー距離についてユーザー定義の指数を使用可能にするには、
{coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0}をcodegen(MATLAB Coder) の-argsの値に含めます。数値の精度のため、生成されたコードにおける同順位の距離の並べ替え順序は MATLAB® における順序と異なる可能性があります。
rangesearchが kd 木探索アルゴリズムを使用し、コード生成のビルド タイプが MEX 関数である場合、codegen(MATLAB Coder) は並列計算用に Intel® スレッディング ビルディング ブロック (TBB) を使用して MEX 関数を生成します。それ以外の場合、codegenはparfor(MATLAB Coder) を使用してコードを生成します。kd 木探索アルゴリズムの場合の MEX 関数 —
codegenは、マルチコア プラットフォームにおける並列計算用に Intel TBB を使用して、最適化された MEX 関数を生成します。この MEX 関数を使用して MATLAB アルゴリズムを高速化できます。Intel TBB の詳細については、https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.htmlを参照してください。生成された
parforバージョンのコードをテストするために MEX 関数を生成する場合、Intel TBB の使用を無効化できます。MEX 構成オブジェクトのExtrinsicCallsプロパティをfalseに設定します。詳細については、coder.MexCodeConfig(MATLAB Coder) を参照してください。網羅的探索アルゴリズムの場合の MEX 関数と、両方のアルゴリズムの場合のスタンドアロン C/C++ コード — 生成される
rangesearchのコードでは、parfor(MATLAB Coder) を使用して、サポートされている共有メモリ マルチコア プラットフォームで並列的に動作するループが作成されます。コンパイラが Open Multiprocessing (OpenMP) アプリケーション インターフェイスをサポートしない場合、または OpenMP ライブラリを無効にした場合、MATLAB Coder™ はparforループをforループとして扱います。サポートされるコンパイラについては、サポートされるコンパイラを参照してください。OpenMP ライブラリを無効にするには、構成オブジェクトのEnableOpenMPプロパティをfalseに設定します。詳細については、coder.CodeConfig(MATLAB Coder) を参照してください。
rangesearchは、生成されたスタンドアロン C/C++ コードにおいて、整数型 (int32) のインデックスを返します。そのため、関数は、単精度の入力を使用する場合、厳密な単精度のサポートを可能にします。MEX コード生成では、関数は依然として MATLAB の動作に一致する倍精度のインデックスを返します。
コード生成の詳細については、コード生成の紹介および一般的なコード生成のワークフローを参照してください。
バージョン履歴
R2011b で導入
参考
createns | ExhaustiveSearcher | KDTreeSearcher | knnsearch | pdist2 | rangesearch
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)