1 // SPDX-License-Identifier: Apache-2.0 2 // 3 // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) 4 // Copyright 2008-2016 National ICT Australia (NICTA) 5 // 6 // Licensed under the Apache License, Version 2.0 (the "License"); 7 // you may not use this file except in compliance with the License. 8 // You may obtain a copy of the License at 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // ------------------------------------------------------------------------ 17 18 19 namespace newarp 20 { 21 22 23 //! Calculate the eigenvalues and eigenvectors of a symmetric tridiagonal matrix. 24 //! This class is a wrapper of the Lapack functions `_steqr`. 25 template<typename eT> 26 class TridiagEigen 27 { 28 private: 29 30 blas_int n; 31 Col<eT> main_diag; // Main diagonal elements of the matrix 32 Col<eT> sub_diag; // Sub-diagonal elements of the matrix 33 Mat<eT> evecs; // To store eigenvectors 34 bool computed; 35 36 37 public: 38 39 //! Default constructor. Computation can 40 //! be performed later by calling the compute() method. 41 inline TridiagEigen(); 42 43 //! Constructor to create an object that calculates the eigenvalues 44 //! and eigenvectors of a symmetric tridiagonal matrix `mat_obj`. 45 inline TridiagEigen(const Mat<eT>& mat_obj); 46 47 //! Compute the eigenvalue decomposition of a symmetric tridiagonal matrix. 48 inline void compute(const Mat<eT>& mat_obj); 49 50 //! Retrieve the eigenvalues. 51 inline Col<eT> eigenvalues(); 52 53 //! Retrieve the eigenvectors. 54 inline Mat<eT> eigenvectors(); 55 }; 56 57 58 } // namespace newarp 59