このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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]}
{1x0 double }
{1x0 double }
{1x0 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]}
{1x0 double }
{1x0 double }
{1x0 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
{1x0 double}
{1x0 double}
{[ 41]}
D=3×1 cell array
{1x0 double}
{1x0 double}
{[ 1.8000]}
距離が 2
以内である患者が X
内に存在するのは、Y
内の 3 番目の患者だけです。
年齢が 40
、体重が 168
である患者に最も近い X
内の患者の Age
と Weight
の値を表示します。
X(Idx{3},:)
ans = 1×2
39 164
入力引数
X
— 入力データ
数値行列
入力データ。各行が 1 つの n 次元点を表す、mx 行 n 列の数値行列を指定します。n の列数は、Y
の列数と等しくなければなりません。
データ型: single
| double
Y
— クエリ点
数値行列
クエリ点。各行が 1 つの n 次元点を表す、my 行 n 列の数値行列を指定します。n の列数は、X
の列数と等しくなければなりません。
データ型: single
| double
名前と値の引数
オプションの引数のペアを 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'
| 'exhaustive'
最近傍探索法。'NSMethod'
と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'kdtree' | Kd 木を作成および使用して最近傍を探索します。
|
'exhaustive' | 網羅的探索アルゴリズムを使用します。最近傍点を求めるため、X のすべての点から Y の各点までの距離が計算されます。 |
X
の列数が 10
以下であり、X
がスパースではなく、距離計量が 'kdtree'
で有効な尺度のいずれかである場合、'kdtree'
が既定値になります。それ以外の場合、既定値は 'exhaustive'
です。
例: 'NSMethod','exhaustive'
Distance
— 距離計量
'euclidean'
(既定値) | 'seuclidean'
| 'mahalanobis'
| 'cityblock'
| 'minkowski'
| 'chebychev'
| 関数ハンドル | ...
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
— ミンコフスキー距離計量の指数
2
(既定値) | 正のスカラー
ミンコフスキー距離計量の指数。'P'
と正のスカラー値をコンマで区切って指定します。この引数は、'Distance'
が 'minkowski'
である場合のみ有効です。
例: 'P',4
データ型: single
| double
Cov
— マハラノビス距離計量の共分散行列
cov(X,'omitrows')
(既定値) | 正定値行列
マハラノビス距離計量の共分散行列。'Cov'
と正定値行列から構成されるコンマ区切りのペアとして指定します。この引数は、'Distance'
が 'mahalanobis'
である場合のみ有効です。
例: 'Cov',eye(4)
データ型: single
| double
Scale
— 標準化されたユークリッド距離計量のスケール パラメーター値
std(X,'omitnan')
(既定値) | 非負のベクトル
標準化されたユークリッド距離計量のスケール パラメーター値。'Scale'
と非負のベクトルから構成されるコンマ区切りのペアとして指定します。Scale
の長さは X
の列数と同じです。X
の行とクエリ点の間の各座標差は、Scale
の対応する要素でスケーリングされます。この引数は、'Distance'
が 'seuclidean'
である場合のみ有効です。
例: 'Scale',iqr(X)
データ型: single
| double
BucketSize
— Kd 木の葉ノードにおけるデータ点の最大数
50
(既定値) | 正の整数スカラー
Kd 木の葉ノードにおけるデータ点の最大数。'BucketSize'
と正の整数スカラーから構成されるコンマ区切りのペアとして指定します。この引数は、NSMethod
が 'kdtree'
である場合のみ有効です。
例: 'BucketSize',20
データ型: single
| double
SortIndices
— 返されたインデックスを距離に従って並べ替えるためのフラグ
true
(1
) (既定値) | false
(0
)
返されたインデックスを距離に従って並べ替えるためのフラグ。'SortIndices'
と true
(1
) または false
(0
) から構成されるコンマ区切りのペアとして指定します。
X
内に多数の最近傍点がある観測値が多数 Y
に含まれている場合、SortIndices
を false
に設定すると速度を向上させることができます。この場合、rangesearch
が返す最近傍点のインデックスに特定の順序はありません。SortIndices
が true
である場合、最近傍点のインデックスは距離の昇順で並べ替えられます。
例: 'SortIndices',false
データ型: logical
出力引数
Idx
— 最近傍点のインデックス
数値ベクトルの cell 配列
最近傍点のインデックス。数値ベクトルの cell 配列として返されます。
Idx
は my 行 1
列の cell 配列です。my は Y
の行数です。ベクトル Idx{j}
には、Y(j,:)
に対する距離が r
以下である X
内の点 (行) のインデックスが格納されます。SortIndices
が true
である場合、rangesearch
はインデックスを距離の昇順で並べ替えます。
D
— クエリ点に対する最近傍点の距離
数値ベクトルの cell 配列
クエリ点に対する最近傍点の距離。数値ベクトルの 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
モデル オブジェクトが必要です。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
使用上の注意事項および制限事項:
X
が tall 配列の場合、Y
を tall 配列にすることはできません。同様に、Y
が tall 配列の場合、X
を tall 配列にすることはできません。
詳細は、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
コード生成では、
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 の動作に一致する倍精度のインデックスを返します。R2020a より前:
rangesearch
は、生成されたスタンドアロン C/C++ コードにおいて、倍精度のインデックスを返します。
コード生成の詳細については、コード生成の紹介および一般的なコード生成のワークフローを参照してください。
バージョン履歴
R2011b で導入
参考
createns
| ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| pdist2
| rangesearch
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)