fn_eig_pair.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
  2. // Copyright 2008-2016 National ICT Australia (NICTA)
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. // ------------------------------------------------------------------------
  15. //! \addtogroup fn_eig_pair
  16. //! @{
  17. template<typename T1, typename T2>
  18. arma_warn_unused
  19. inline
  20. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, Col< std::complex<typename T1::pod_type> > >::result
  21. eig_pair
  22. (
  23. const Base<typename T1::elem_type, T1>& A_expr,
  24. const Base<typename T1::elem_type, T2>& B_expr
  25. )
  26. {
  27. arma_extra_debug_sigprint();
  28. typedef typename T1::pod_type T;
  29. Col< std::complex<T> > eigvals;
  30. Mat< std::complex<T> > eigvecs;
  31. const bool status = auxlib::eig_pair(eigvals, eigvecs, false, A_expr.get_ref(), B_expr.get_ref());
  32. if(status == false)
  33. {
  34. eigvals.soft_reset();
  35. arma_stop_runtime_error("eig_pair(): decomposition failed");
  36. }
  37. return eigvals;
  38. }
  39. template<typename T1, typename T2>
  40. inline
  41. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  42. eig_pair
  43. (
  44. Col< std::complex<typename T1::pod_type> >& eigvals,
  45. const Base< typename T1::elem_type, T1 >& A_expr,
  46. const Base< typename T1::elem_type, T2 >& B_expr
  47. )
  48. {
  49. arma_extra_debug_sigprint();
  50. typedef typename T1::pod_type T;
  51. Mat< std::complex<T> > eigvecs;
  52. const bool status = auxlib::eig_pair(eigvals, eigvecs, false, A_expr.get_ref(), B_expr.get_ref());
  53. if(status == false)
  54. {
  55. eigvals.soft_reset();
  56. arma_debug_warn("eig_pair(): decomposition failed");
  57. }
  58. return status;
  59. }
  60. template<typename T1, typename T2>
  61. inline
  62. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  63. eig_pair
  64. (
  65. Col< std::complex<typename T1::pod_type> >& eigvals,
  66. Mat< std::complex<typename T1::pod_type> >& eigvecs,
  67. const Base< typename T1::elem_type, T1 >& A_expr,
  68. const Base< typename T1::elem_type, T2 >& B_expr
  69. )
  70. {
  71. arma_extra_debug_sigprint();
  72. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&eigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'eigvec'" );
  73. const bool status = auxlib::eig_pair(eigvals, eigvecs, true, A_expr.get_ref(), B_expr.get_ref());
  74. if(status == false)
  75. {
  76. eigvals.soft_reset();
  77. eigvecs.soft_reset();
  78. arma_debug_warn("eig_pair(): decomposition failed");
  79. }
  80. return status;
  81. }
  82. template<typename T1, typename T2>
  83. inline
  84. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  85. eig_pair
  86. (
  87. Col< std::complex<typename T1::pod_type> >& eigvals,
  88. Mat< std::complex<typename T1::pod_type> >& leigvecs,
  89. Mat< std::complex<typename T1::pod_type> >& reigvecs,
  90. const Base< typename T1::elem_type, T1 >& A_expr,
  91. const Base< typename T1::elem_type, T2 >& B_expr
  92. )
  93. {
  94. arma_extra_debug_sigprint();
  95. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&leigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'leigvec'" );
  96. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&reigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'reigvec'" );
  97. arma_debug_check( (void_ptr(&leigvecs) == void_ptr(&reigvecs)), "eig_pair(): parameter 'leigvec' is an alias of parameter 'reigvec'" );
  98. const bool status = auxlib::eig_pair_twosided(eigvals, leigvecs, reigvecs, A_expr.get_ref(), B_expr.get_ref());
  99. if(status == false)
  100. {
  101. eigvals.soft_reset();
  102. leigvecs.soft_reset();
  103. reigvecs.soft_reset();
  104. arma_debug_warn("eig_pair(): decomposition failed");
  105. }
  106. return status;
  107. }
  108. //! @}