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