ANN库的使用

ANN库的使用

什么是ANN?

(1)ANN——Approximate Nearest Neighbor,是一个用 C++ 编程语言编写的库,
支持在各种维度的空间中进行精确和近似最近邻搜索。

(2)在最近邻问题中,给出d维空间中的一组数据点P,这些点被预处理成一个数据结构即kd树;
kd树的建立使我们能够对于任意查询点q,可以有效地找出p到q的最近点。

(3)ANN 是为足够小的数据集设计的,搜索结构可以存储在主存储器中(与假设数据驻留在
辅助存储器中的数据库方法相反)。假设点表示为实数(或整数)的坐标向量。两点之间的
距离可以通过多种方式定义。

ANN库使用的基本语法

//ANN库头文件
 #include<ANN.h>  ---开启ANN库的世界
// 给待处理数据构建一个数据结构(kd树)
ANNkd_tree::ANNkd_tree(
            ANNpointArray pa,    //数据点数组(待处理点)
            int            n,    //数据点数量
            int            d);   //空间维度(一般设为1)
//----------------------------------------------------------------------------------
//k近邻搜索两种方法
//法一:annkSearch
virtual void ANNkd_tree::annkSearch(
        ANNpoint            q,       //查询点(目的就是要查询数据点中,点q的最近邻点)
        int                 k,       //要查找的邻近点数(可以自定义也可以利用法二计算)
        ANNidxArray    nn_idx,       //查询到的q的最邻近点组成的数组(任选参数)
        ANNdistArray    dists,       //最邻近点与点q的距离(任选参数)
        double          eps=0.0);    //误差限
//对于数组nn_idx:查询到的q的最邻近点存储在数组nn_idx数组中,
//其中最近的存储在nn_idx[0],第二近的在nn_idx[1]中...以此类推
//对于数组 dists:存储的为相关点到点q的平方距离
//法二:annkFRSearch
virtual int ANNkd_tree::annkFRSearch(
        ANNpoint            q,      
        ANNdist         sqRad,       //查询半径的平方(自定义)            
        int             k = 0,       //邻近点个数,返回值       
        ANNidxArray    nn_idx,       
        ANNdistArray    dists,       
        double          eps=0.0);   
//与annkSearch()不同,annkFRSearch()没有优先搜索的功能,
//它是一个一个地访问搜索半径内的所有点,然后找到点q的最邻近点
//----------------------------------------------------------------------------------
//为ANNpoint分配存储空间
ANNpoint annAllocPt(
        int         dim,             //空间维度
        ANNcoord     c=0);           //初始的坐标值(任选参数)
//释放由 annAllocPt 分配的点 p 的存储空间并置 p 为 NULL
void annDealocPt(
        ANNpoint&           p);

示例程序

...
#include <fstream>    //文件输入输出流
#include <ANN/ANN.h>   //ANN声明
ANNpoint p = annAllocPt(1)  //创建ann一维空间
ANNkd_tree point_tree(points,size,1) //构建kd树
int k  = points_tree.annkFRSearch(p, r^2, 0); //返回邻近点个数
ANNidxArray nn_idx = new int[k]; 
ANNdistArray dd = new double[k];	
points_tree.annkFRSearch(p,r^2,k, nn_idx, dd);
annDeallocPt(p);
annClose();         //ANN结束

其他关于ANN更详细的说明及用法详见ANN官方操作手册:

https://www.cs.umd.edu/~mount/ANN/Files/1.1.1/ANNmanual_1.1.1.pdf

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值