3

以下代码来自 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找到

4

1 回答 1

2

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

于 2018-06-22T13:58:37.313 回答