rangesearch
使用输入数据查找指定距离内的所有邻居
描述
例子
找到指定距离内的所有点
找到X
在欧氏距离内的点1.5
每一个Y
点。这两个X
而且Y
是五维正态分布变量的样本。
rng (“默认”)%的再现性X = randn (100 5);Y = randn(10、5);[Idx D] = rangesearch (X, Y, 1.5)
Idx =10×1单元阵列{[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单元阵列{[0.9546 1.0987 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.1244 1.4672]}{[0.7863 0.9326 0.9773 1.0508 1.1722 1.1934 1.3218 1.3623 1.3869…]} {[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
分大于1.5
远离任何东西的距离X
点。X(89年:)
是1.1739
距离: Y(7日)
,没有其他X
点在距离内1.5
的: Y(7日)
.X
包含12
内点的距离1.5
的: Y(5日)
.
在聚类数据中查找最近的点
从三个不同的多元正态分布中生成5000个随机点。移动分布的均值,使随机生成的点可能形成三个独立的簇。
rng (“默认”)%的再现性N = 5000;dist = 10;X = [mvnrnd([0 0],eye(2),N);mvnrnd (dist *[1],眼(2),N);mvnrnd (dist *[1],眼(2),N)];
中的每一点X
求其中的点X
在一个半径内经销
离题了。为了加快计算速度,指定保持最近邻居的索引未排序。选择X中的第一个点,找出它最近的邻居。
Idx = rangesearch (X, X,经销,“SortIndices”、假);x = x (1:);nearestPoints = X (: Idx {1});
找到中的值X
不是最近的邻居x
.用一种颜色显示这些点和最近的邻居x
换一种颜色。标签的x
用一个黑色的填充圈。
nonNearestIdx = true(大小(X, 1), 1);nonNearestIdx (Idx {1}) = false;散射(X (nonNearestIdx, 1), X (nonNearestIdx 2))在散射(nearestPoints (: 1) nearestPoints(:, 2)散射(x (1), (2),“黑”,“填充”)举行从
使用自定义距离函数查找最近的点
找到病人在病人
在患者的一定年龄和体重范围内的数据集Y
.
加载病人
数据集。的年龄
价值是以年为单位的重量
数值以磅为单位。
负载病人X =[年龄体重];Y = [20 162;30 169;40 168];%的新病人
创建一个自定义距离函数distfun
这在年龄和体重方面决定了患者之间的距离。例如,根据distfun
,两个年龄相差1岁、体重相同的患者相距一个距离单位。同样地,两个年龄相同、体重相差5磅的病人也相距一个距离单位。
类型distfun.m显示distfun的内容。m文件
函数D2 = distfun(ZI,ZJ) ageDifference = abs(ZI(1)-ZJ(:,1));weightDifference = abs(子(2)zj (:, 2));D2 =年龄差+ 0.2*体重差;结束
注意:如果单击位于此示例右上方部分的按钮并在MATLAB®中打开该示例,则MATLAB将打开示例文件夹。这个文件夹包含函数文件distfun.m
.
找到医院的病人X
都在距离之内2
的病人Y
.
[Idx D] = rangesearch (X, Y, 2,“距离”@distfun)
Idx =3×1单元阵列{1x0 double} {1x0 double} {[41]}
D =3×1单元阵列{1x0 double} {1x0 double} {[1.8000]}
第三位病人Y
这是唯一有病人的医院吗X
在…2
.
显示年龄
而且重量
最近的病人的数值X
给有年龄的病人40
和重量168
.
X (Idx {3}:)
ans =1×2164年39
输入参数
X
- - - - - -输入数据
数字矩阵
输入数据,指定为mx——- - - - - -n数字矩阵,每一行代表一个n维点。列数n必须等于的列数Y
.
数据类型:单
|双
Y
- - - - - -查询点
数字矩阵
查询点,指定为我的——- - - - - -n数字矩阵,每一行代表一个n维点。列数n必须等于的列数X
.
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名-值参数必须出现在其他参数之后,但对的顺序并不重要。
在R2021a之前,名称和值之间用逗号隔开,并括起来的名字
在报价。
例子:rangesearch (X, Y, 1.4,“距离”,“seuclidean”,“规模”,差(X))
指定查找中的所有观察值X
在距离1.4
的每一个观察结果Y
的四分位范围缩放的标准化欧几里得距离X
.
距离
- - - - - -距离度量
“欧几里得”
(默认)|“seuclidean”
|“mahalanobis”
|“cityblock”
|闵可夫斯基的
|“chebychev”
|函数处理|……
距离度量,rangesearch
使用,指定为逗号分隔的对,由“距离”
和这个表中的一个值。
价值 | 描述 |
---|---|
“欧几里得” |
欧氏距离。 |
“seuclidean” |
标准化的欧氏距离。每一行之间的坐标差X 通过除以相应的标准偏差的元素来计算查询点X ,性病(X, omitnan) .要指定另一个缩放,请使用“规模” 名称-值对的论点。 |
“mahalanobis” |
马氏距离,用正定协方差矩阵计算C .的默认值。C 样本协方差矩阵是X ,按X (X, omitrows) .指定不同的值C ,可以使用“浸” 名称-值对的论点。 |
“cityblock” |
城市街区的距离。 |
闵可夫斯基的 |
闵可夫斯基距离。默认指数为2 .要指定不同的指数,请使用“P” 名称-值对的论点。 |
“chebychev” |
切比乔夫距离(最大坐标差)。 |
的余弦 |
1减去观测值之间夹角的余弦(作为向量处理)。 |
“相关” |
1减去观察值之间的样本线性相关性(作为值序列处理)。 |
“汉明” |
汉明距离,不同坐标的百分比。 |
“jaccard” |
1减去雅卡德系数,非零坐标的百分比。 |
“枪兵” |
1减去观察值之间的样本斯皮尔曼秩相关(作为值序列处理)。 |
@ |
自定义距离函数手柄。距离函数有这样的形式 函数ZJ D2 = distfun(子)距离百分比计算...
|
有关更多信息,请参见距离度量.
例子:“距离”,“闵可夫斯基”
P
- - - - - -闵可夫斯基距离度量的指数
2
(默认)|积极的标量
闵可夫斯基距离度量的指数,指定为逗号分隔的对,由“P”
一个正的标量。这个论点只有在“距离”
是闵可夫斯基的
.
例子:“P”4
数据类型:单
|双
浸
- - - - - -马氏距离度量的协方差矩阵
X (X, omitrows)
(默认)|正定矩阵
马氏距离度量的协方差矩阵,指定为逗号分隔的对,由“浸”
一个正定矩阵。这个论点只有在“距离”
是“mahalanobis”
.
例子:“浸”,眼睛(4)
数据类型:单
|双
规模
- - - - - -标准化欧氏距离度量的尺度参数值
性病(X, omitnan)
(默认)|负的向量
标度参数值的标准化欧氏距离度量,指定为逗号分隔的对,由“规模”
一个非负的向量。规模
长度是否等于中的列数X
.每一行之间的坐标差X
的对应元素对查询点进行缩放规模
.这个论点只有在“距离”
是“seuclidean”
.
例子:“规模”,差(X)
数据类型:单
|双
BucketSize
- - - - - -的叶节点中的最大数据点数Kd-tree
50
(默认)|正整数标量
的叶节点中的最大数据点数Kd-树,指定为逗号分隔的对,由“BucketSize”
和一个正整数标量。这个论点只有在NSMethod
是“kdtree”
.
例子:“BucketSize”,20
数据类型:单
|双
输出参数
Idx
-最近点的索引
数值向量的单元格数组
最近点的索引,作为数值向量的单元格数组返回。
Idx
是一个我的——- - - - - -1
单元阵列,我的行数在吗Y
.向量Idx {j}
中的点(行)的索引X
他们的距离Y (j,:)
不大于r
.如果SortIndices
是真正的
,然后rangesearch
按距离升序排列索引。
D
—最近点到查询点的距离
数值向量的单元格数组
最近的点到查询点的距离,作为数值向量的单元格数组返回。
D
是一个我的——- - - - - -1
单元阵列,我的行数在吗Y
.D {j}
包含之间的距离值Y (j,:)
和点(行)在X (Idx {j},:)
.如果SortIndices
是真正的
,然后rangesearch
按升序排列距离。
提示
算法
的概述kd-tree算法,看到基于kd -树的k近邻搜索.
选择功能
如果你设置rangesearch
函数“NSMethod”
名称-值对参数的适当值(“详尽”
对于穷尽搜索算法或者“kdtree”
对于一个KD-tree算法),则搜索结果与使用rangesearch
对象的功能。不像rangesearch
函数,rangesearch
对象函数需要ExhaustiveSearcher
或KDTreeSearcher
模型对象。
扩展功能
高大的数组
使用行数超过内存容量的数组进行计算。
C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
的默认值用于代码生成
“NSMethod”
名值对参数为“详尽”
当列数在X
大于7。的值
“距离”
名值对参数必须是编译时常量,不能是自定义距离函数。的
“SortIndices”
不支持名称-值对参数。输出参数总是排序的。名称-值参数中的名称必须是编译时常量。例如,要允许在生成的代码中使用用户定义的闵可夫斯基距离指数,请使用include
{coder.Constant(的距离),coder.Constant(“闵可夫斯基”),coder.Constant(“P”),0}
在arg游戏
的价值codegen
(MATLAB编码器).生成的代码中绑定距离的排序顺序可以与MATLAB中的顺序不同®由于数值精度。
当
rangesearch
使用kd树搜索算法,代码生成构建类型为MEX函数,codegen
(MATLAB编码器)使用Intel生成MEX函数®线程构建块(TBB)用于并行计算。否则,codegen
生成的代码使用parfor
(MATLAB编码器).MEX功能用于kd-树搜索算法-
codegen
使用Intel TBB生成优化的MEX函数,用于多核平台上的并行计算。您可以使用MEX函数来加速MATLAB算法。有关Intel TBB的详细信息,请参见https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.html.如果生成了MEX函数来测试生成的代码
parfor
版本,您可以禁用Intel TBB的使用。设置ExtrinsicCalls
属性的MEX配置对象假
.有关详细信息,请参见编码器。MexCodeConfig
(MATLAB编码器).MEX函数的穷举搜索算法和独立的C/ c++代码的两个算法-的生成代码
rangesearch
使用parfor
(MATLAB编码器)在生成的代码中创建在受支持的共享内存多核平台上并行运行的循环。如果您的编译器不支持Open Multiprocessing (OpenMP)应用程序接口或禁用了OpenMP库,MATLAB编码器™将parfor
循环,为
循环。要查找支持的编译器,请参见支持编译器.若要禁用OpenMP库,请设置EnableOpenMP
属性的配置对象假
.有关详细信息,请参见编码器。CodeConfig
(MATLAB编码器).
从R2020a开始,
rangesearch
返回整数类型(int32
)索引,而不是在生成的独立C/ c++代码中使用双精度索引。因此,当您使用单精度输入时,该函数允许严格的单精度支持。对于MEX代码生成,函数仍然返回双精度指标以匹配MATLAB行为。
版本历史
介绍了R2011b
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。