c++ - Libigl - Laplace Bletrami 算子分解

标签 c++ geometry computational-geometry libigl

以下代码来自 Libigl 的教程 306:http://libigl.github.io/libigl/tutorial/#eigen-decomposition

  ........
  SparseMatrix<double> L,M;
  cotmatrix(V,F,L);
  L = (-L).eval();     // WHY?????
  massmatrix(V,F,MASSMATRIX_TYPE_DEFAULT,M);
  const size_t k = 5;
  if(!eigs(L,M,k+1,EIGS_TYPE_SM,U,D))
  {
    cout<<"failed."<<endl;
  }
  // Normalize
  U = ((U.array()-U.minCoeff())/(U.maxCoeff()-U.minCoeff())).eval();
  .......

我不明白 L = (-L).eval(); 谁能帮帮我? 完整代码可见https://github.com/libigl/libigl/blob/master/tutorial/306_EigenDecomposition/main.cpp

最佳答案

不同的人对拉普拉斯算子使用不同的约定。 libigl 产生负半定拉普拉斯算子(参见 documentation notes )。因此,该矩阵具有非正特征值。另一方面,libigl::eigs() 需要一个半正定矩阵。这就是为什么 L 被取反(将负半定矩阵变成半正定矩阵)。

关于c++ - Libigl - Laplace Bletrami 算子分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980317/

相关文章:

c++ - CUDA:跨不同内核使用共享内存

java - WorldWind 球线相交错误?

algorithm - Fortune 的算法和圆圈作为扫描线

python - 如何计算python中两点之间直线的坐标?

algorithm - 计算不同引用系中的坐标

c++ - Eigen C++ 中的逐列点积

c# - 从 C++ DLL 获取 char * 到 C# 应用程序

c++ - 我们可以有多少级别的指针?

c# - 判断三角形是否正对

geometry - Three.js 在 render() 上未缩放或旋转网格