brute.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:4k
源码类别:

并行计算

开发平台:

Visual C++

  1. //----------------------------------------------------------------------
  2. // File: brute.cpp
  3. // Programmer: Sunil Arya and David Mount
  4. // Description: Brute-force nearest neighbors
  5. // Last modified: 05/03/05 (Version 1.1)
  6. //----------------------------------------------------------------------
  7. // Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
  8. // David Mount.  All Rights Reserved.
  9. // 
  10. // This software and related documentation is part of the Approximate
  11. // Nearest Neighbor Library (ANN).  This software is provided under
  12. // the provisions of the Lesser GNU Public License (LGPL).  See the
  13. // file ../ReadMe.txt for further information.
  14. // 
  15. // The University of Maryland (U.M.) and the authors make no
  16. // representations about the suitability or fitness of this software for
  17. // any purpose.  It is provided "as is" without express or implied
  18. // warranty.
  19. //----------------------------------------------------------------------
  20. // History:
  21. // Revision 0.1  03/04/98
  22. // Initial release
  23. // Revision 1.1  05/03/05
  24. // Added fixed-radius kNN search
  25. //----------------------------------------------------------------------
  26. #if defined(_MSC_VER)
  27.     #pragma warning (disable: 4127)
  28. #endif
  29. #include "../ANNx.h" // all ANN includes
  30. #include "pr_queue_k.h" // k element priority queue
  31. //----------------------------------------------------------------------
  32. // Brute-force search simply stores a pointer to the list of
  33. // data points and searches linearly for the nearest neighbor.
  34. // The k nearest neighbors are stored in a k-element priority
  35. // queue (which is implemented in a pretty dumb way as well).
  36. //
  37. // If ANN_ALLOW_SELF_MATCH is ANNfalse then data points at distance
  38. // zero are not considered.
  39. //
  40. // Note that the error bound eps is passed in, but it is ignored.
  41. // These routines compute exact nearest neighbors (which is needed
  42. // for validation purposes in ann_test.cpp).
  43. //----------------------------------------------------------------------
  44. ANNbruteForce::ANNbruteForce( // constructor from point array
  45. ANNpointArray pa, // point array
  46. int n, // number of points
  47. int dd) // dimension
  48. {
  49. dim = dd;  n_pts = n;  pts = pa;
  50. }
  51. ANNbruteForce::~ANNbruteForce() { } // destructor (empty)
  52. void ANNbruteForce::annkSearch( // approx k near neighbor search
  53. ANNpoint q, // query point
  54. int k, // number of near neighbors to return
  55. ANNidxArray nn_idx, // nearest neighbor indices (returned)
  56. ANNdistArray dd, // dist to near neighbors (returned)
  57. double    ) // error bound (ignored)
  58. {
  59. ANNmin_k mk(k); // construct a k-limited priority queue
  60. int i;
  61. if (k > n_pts) { // too many near neighbors?
  62. annError("Requesting more near neighbors than data points", ANNabort);
  63. }
  64. // run every point through queue
  65. for (i = 0; i < n_pts; i++) {
  66. // compute distance to point
  67. ANNdist sqDist = annDist(dim, pts[i], q);
  68. if (ANN_ALLOW_SELF_MATCH || sqDist != 0)
  69. mk.insert(sqDist, i);
  70. }
  71. for (i = 0; i < k; i++) { // extract the k closest points
  72. dd[i] = mk.ith_smallest_key(i);
  73. nn_idx[i] = mk.ith_smallest_info(i);
  74. }
  75. }
  76. int ANNbruteForce::annkFRSearch( // approx fixed-radius kNN search
  77. ANNpoint q, // query point
  78. ANNdist sqRad, // squared radius
  79. int k, // number of near neighbors to return
  80. ANNidxArray nn_idx, // nearest neighbor array (returned)
  81. ANNdistArray dd, // dist to near neighbors (returned)
  82. double    ) // error bound
  83. {
  84. ANNmin_k mk(k); // construct a k-limited priority queue
  85. int i;
  86. int pts_in_range = 0; // number of points in query range
  87. // run every point through queue
  88. for (i = 0; i < n_pts; i++) {
  89. // compute distance to point
  90. ANNdist sqDist = annDist(dim, pts[i], q);
  91. if (sqDist <= sqRad && // within radius bound
  92. (ANN_ALLOW_SELF_MATCH || sqDist != 0)) { // ...and no self match
  93. mk.insert(sqDist, i);
  94. pts_in_range++;
  95. }
  96. }
  97. for (i = 0; i < k; i++) { // extract the k closest points
  98. if (dd != NULL)
  99. dd[i] = mk.ith_smallest_key(i);
  100. if (nn_idx != NULL)
  101. nn_idx[i] = mk.ith_smallest_info(i);
  102. }
  103. return pts_in_range;
  104. }