为什么我使用 knn 的 libigl 代码需要很长时间才能完成?

Why does my libigl code using knn take forever to complete?

提问人:user27665 提问时间:10/23/2023 最后编辑:marc_suser27665 更新时间:10/27/2023 访问量:50

问:

以下代码加载网格文件,从网格创建一组随机点的向量。然后,它使用 knn 为每组随机点在网格上找到最近的点。我发现代码永远卡在 knn 步骤中。这适用于具有 50000 个点和 100000 个面的网格。如何加快速度?我的代码中是否有任何错误,如下所示:

#include <igl/read_triangle_mesh.h>
#include <igl/octree.h>
#include <igl/knn.h>
#include <igl/random_points_on_mesh.h>
#include <igl/opengl/glfw/Viewer.h>
#include <igl/get_seconds.h>
#include <iostream>
#include <cstdlib>
#include <vector>

int main(int argc, char *argv[])
{

  Eigen::MatrixXd V;
  Eigen::MatrixXi F;
  igl::read_triangle_mesh(argv[1],V,F);
  // Sample mesh for point cloud

  std::cout << "no. of points, faces "<< V.rows()<<"," <<F.rows()<< std::endl;

  std::vector<Eigen::MatrixXd> vec_pts;

  for (int i =0;i<10;i++)
  {
    Eigen::MatrixXd P;
    Eigen::VectorXi I;
    Eigen::MatrixXd B;
    igl::random_points_on_mesh(25,V,F,B,I,P);
    vec_pts.push_back(P);
  }

  std::cout  << "points created "<< std::endl;

  // Build octree
  std::vector<std::vector<int > > O_PI;
  Eigen::MatrixXi O_CH;
  Eigen::MatrixXd O_CN;
  Eigen::VectorXd O_W;

  igl::octree(V,O_PI,O_CH,O_CN,O_W);
  std::cout  << "octree created "<< std::endl;


  for (int i=0;i< vec_pts.size();i++)
  {
    Eigen::MatrixXd query = vec_pts[i];
    Eigen::VectorXi I;
    const double t_before = igl::get_seconds();
    igl::knn(query,1,O_PI,O_CH,O_CN,O_W,I);
    const double t_after = igl::get_seconds();
    std::cout  << "time for knn query in sec "<< t_after - t_before << std::endl;
  }
}
C++ 性能 knn octree libigl

评论

0赞 drescherjm 10/24/2023
您是否运行的是优化/发布模式的可执行文件,而不是调试版本?我之所以问,是因为我在 msvc 中看到过这样的情况,其中调试可执行文件花费的时间是使用相同代码和数据的发布需要 100 倍的时间(发布时的几分钟到调试时的一天以上)。
0赞 user27665 10/24/2023
它处于发布模式。

答: 暂无答案