polyroots.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2014 Olga Diamanti <olga.diam@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "polyroots.h"
  9. #include <Eigen/Eigenvalues>
  10. template <typename S, typename T>
  11. IGL_INLINE void igl::polyRoots(Eigen::Matrix<S, Eigen::Dynamic,1> &polyCoeff, //real or comples coefficients
  12. Eigen::Matrix<std::complex<T>, Eigen::Dynamic,1> &roots // complex roots (double or float)
  13. )
  14. {
  15. // degree
  16. int n = polyCoeff.rows() - 1;
  17. Eigen::Matrix<S, Eigen::Dynamic, 1> d (n,1);
  18. d = polyCoeff.tail(n)/polyCoeff(0);
  19. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> I; I.setIdentity(n-1,n-1);
  20. Eigen::Matrix<S, Eigen::Dynamic, 1> z; z.setZero(n-1,1);
  21. Eigen::Matrix<S, Eigen::Dynamic, Eigen::Dynamic> a(n,n);
  22. a<<-d.transpose(),I,z;
  23. roots = a.eigenvalues();
  24. }
  25. #ifdef IGL_STATIC_LIBRARY
  26. // Explicit template specialization
  27. template void igl::polyRoots<std::complex<double>, double>(Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);
  28. template void igl::polyRoots<double, double>(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1>&);
  29. #endif