DiagonalMatrixApprox.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /**
  2. * @file DiagonalMatrixApprox.h
  3. * @author Erik Rodner
  4. * @date 05/31/2012
  5. */
  6. #ifndef _NICE_DIAGONALMATRIXAPPROXINCLUDE
  7. #define _NICE_DIAGONALMATRIXAPPROXINCLUDE
  8. #include <core/vector/MatrixT.h>
  9. #include <core/vector/VectorT.h>
  10. #include <core/optimization/gradientBased/OptimizationProblemFirst.h>
  11. #include <core/optimization/gradientBased/OptimizationAlgorithmFirst.h>
  12. namespace NICE {
  13. /** @class DiagonalMatrixApprox
  14. * find a diagonal matrix to approximate bilinear products
  15. * (Method according to Chen et al., "Smooth convex approximation to the maximum eigenvalue function", 2004, J. of Global Optimization)
  16. *
  17. * @author Erik Rodner
  18. */
  19. class DiagonalMatrixApprox
  20. {
  21. protected:
  22. bool verbose;
  23. double epsilonStart;
  24. double epsilonShrinkFactor;
  25. double minFDelta;
  26. double minSolDelta;
  27. uint maxEpsilonIterations;
  28. OptimizationAlgorithmFirst *optimizer;
  29. public:
  30. /** simple constructor */
  31. DiagonalMatrixApprox( bool verbose = false, int maxIterations = -50 );
  32. /** simple destructor */
  33. virtual ~DiagonalMatrixApprox();
  34. /**
  35. * @brief Approximate a (positive-definite) matrix A with a diagonal matrix, such that bilinear products are approximated.
  36. * This is done by minimizing the largest eigenvalue of (A-D)
  37. *
  38. * @param A input matrix
  39. * @param D resulting diagonal matrix given as a vector
  40. */
  41. void approx ( const Matrix & A, Vector & D ) const;
  42. };
  43. /** corresponding optimization problem of DiagonalMatrixApprox (do not use directly) */
  44. class DiagonalMatrixApproxOptimizationProblem : public OptimizationProblemFirst
  45. {
  46. protected:
  47. bool verbose;
  48. const Matrix *A;
  49. double epsilon;
  50. /** cached eigen-decomposition */
  51. Matrix eigenvectors;
  52. Vector eigenvalues;
  53. public:
  54. /**
  55. * @brief Constructor
  56. *
  57. * @param gm input generic matrix object
  58. */
  59. DiagonalMatrixApproxOptimizationProblem ( const Matrix *A, const Vector & D0, double epsilon, bool verbose = false );
  60. /**
  61. * @brief Compute the objective
  62. *
  63. * @return
  64. */
  65. virtual double computeObjective();
  66. /**
  67. * @brief Compute the gradient of the problem
  68. *
  69. * @param newGradient output gradient vector
  70. */
  71. virtual void computeGradient( NICE::Vector& newGradient);
  72. /**
  73. * @brief get smallest eigenvalue
  74. * @return smallest eigenvalue
  75. */
  76. double getSmallestEigenvalue () const
  77. {
  78. return (eigenvalues.size()>0) ? eigenvalues[eigenvalues.size() - 1] : 0.0;
  79. }
  80. };
  81. }
  82. #endif