fn_eig_gen.hpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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_gen
  16. //! @{
  17. template<typename T1>
  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_gen
  22. (
  23. const Base<typename T1::elem_type, T1>& expr,
  24. const char* option = "nobalance"
  25. )
  26. {
  27. arma_extra_debug_sigprint();
  28. typedef typename T1::pod_type T;
  29. typedef typename std::complex<T> eT;
  30. const char sig = (option != NULL) ? option[0] : char(0);
  31. arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" );
  32. if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn( "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); }
  33. Col<eT> eigvals;
  34. Mat<eT> eigvecs;
  35. const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, false, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, false, expr.get_ref());
  36. if(status == false)
  37. {
  38. eigvals.soft_reset();
  39. arma_stop_runtime_error("eig_gen(): decomposition failed");
  40. }
  41. return eigvals;
  42. }
  43. template<typename T1>
  44. inline
  45. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  46. eig_gen
  47. (
  48. Col< std::complex<typename T1::pod_type> >& eigvals,
  49. const Base< typename T1::elem_type, T1>& expr,
  50. const char* option = "nobalance"
  51. )
  52. {
  53. arma_extra_debug_sigprint();
  54. typedef typename T1::pod_type T;
  55. typedef typename std::complex<T> eT;
  56. const char sig = (option != NULL) ? option[0] : char(0);
  57. arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" );
  58. if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn( "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); }
  59. Mat<eT> eigvecs;
  60. const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, false, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, false, expr.get_ref());
  61. if(status == false)
  62. {
  63. eigvals.soft_reset();
  64. arma_debug_warn("eig_gen(): decomposition failed");
  65. }
  66. return status;
  67. }
  68. template<typename T1>
  69. inline
  70. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  71. eig_gen
  72. (
  73. Col< std::complex<typename T1::pod_type> >& eigvals,
  74. Mat< std::complex<typename T1::pod_type> >& eigvecs,
  75. const Base<typename T1::elem_type, T1>& expr,
  76. const char* option = "nobalance"
  77. )
  78. {
  79. arma_extra_debug_sigprint();
  80. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&eigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'eigvec'" );
  81. const char sig = (option != NULL) ? option[0] : char(0);
  82. arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" );
  83. if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn( "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); }
  84. const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, true, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, true, expr.get_ref());
  85. if(status == false)
  86. {
  87. eigvals.soft_reset();
  88. eigvecs.soft_reset();
  89. arma_debug_warn("eig_gen(): decomposition failed");
  90. }
  91. return status;
  92. }
  93. template<typename T1>
  94. inline
  95. typename enable_if2< is_supported_blas_type<typename T1::pod_type>::value, bool >::result
  96. eig_gen
  97. (
  98. Col< std::complex<typename T1::pod_type> >& eigvals,
  99. Mat< std::complex<typename T1::pod_type> >& leigvecs,
  100. Mat< std::complex<typename T1::pod_type> >& reigvecs,
  101. const Base<typename T1::elem_type, T1>& expr,
  102. const char* option = "nobalance"
  103. )
  104. {
  105. arma_extra_debug_sigprint();
  106. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&leigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'leigvec'" );
  107. arma_debug_check( (void_ptr(&eigvals) == void_ptr(&reigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'reigvec'" );
  108. arma_debug_check( (void_ptr(&leigvecs) == void_ptr(&reigvecs)), "eig_gen(): parameter 'leigvec' is an alias of parameter 'reigvec'" );
  109. const char sig = (option != NULL) ? option[0] : char(0);
  110. arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" );
  111. if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn( "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); }
  112. const bool status = (sig == 'b') ? auxlib::eig_gen_twosided_balance(eigvals, leigvecs, reigvecs, expr.get_ref()) : auxlib::eig_gen_twosided(eigvals, leigvecs, reigvecs, expr.get_ref());
  113. if(status == false)
  114. {
  115. eigvals.soft_reset();
  116. leigvecs.soft_reset();
  117. reigvecs.soft_reset();
  118. arma_debug_warn("eig_gen(): decomposition failed");
  119. }
  120. return status;
  121. }
  122. //! @}