2 #ifndef vnl_symmetric_eigensystem_hxx_ 3 #define vnl_symmetric_eigensystem_hxx_ 18 # include <vcl_msvc_warnings.h> 39 const T b = -M11-M22-M33;
40 const T c = M11*M22 +M11*M33 +M22*M33 -M12*M12 -M13*M13 -M23*M23;
41 const T d = M11*M23*M23 +M12*M12*M33 +M13*M13*M22 -2*M12*M13*M23 -M11*M22*M33;
45 const T f = b_3*b_3 - c/3 ;
46 const T g = b*c/6 - b_3*b_3*b_3 - d/2;
50 l1 = l2 = l3 = - b_3 ;
56 const T sqrt_f = -std::sqrt(f);
68 l1 = 2 * sqrt_f - b_3;
69 l2 = l3 = - sqrt_f - b_3;
73 l1 = l2 = sqrt_f - b_3;
74 l3 = -2 * sqrt_f - b_3;
80 const T sqrt_f3 = sqrt_f * sqrt_f * sqrt_f;
81 const T k = std::acos(g / sqrt_f3) / 3;
82 const T j = 2 * sqrt_f;
83 l1 = j * std::cos(k) - b_3;
84 l2 = j * std::cos(k + T(vnl_math::twopi / 3.0)) - b_3;
85 l3 = j * std::cos(k - T(vnl_math::twopi / 3.0)) - b_3;
101 const long n = A.
rows();
114 long want_eigenvectors = 1;
118 v3p_netlib_rs_(&n, &n, Ad.data_block(), &Dd[0], &want_eigenvectors, &Vvec[0], &work1[0], &work2[0], &ierr);
122 std::cerr <<
"vnl_symmetric_eigensystem: ierr = " << ierr <<
'\n';
129 double *vptr = &Vvec[0];
130 for (
int c = 0; c < n; ++c)
131 for (
int r = 0; r < n; ++r)
142 : n_(A.rows()), V(n_, n_), D(n_)
149 for (
int i = 0; i <
n_; ++i)
181 int const n = D.size();
183 for (
int i=0; i<n; ++i)
191 unsigned n = D.rows();
193 for (
unsigned i=0; i<n; ++i)
195 std::cerr << __FILE__
": pinverse(): eigenvalue " << i <<
" is zero.\n";
199 invD(i, i) = 1 / D(i, i);
200 return V * invD * V.transpose();
206 unsigned n = D.rows();
208 for (
unsigned i=0; i<n; ++i)
210 std::cerr << __FILE__
": square_root(): eigenvalue " << i <<
" is negative (" << D(i, i) <<
").\n";
216 return V * sqrtD * V.transpose();
222 unsigned n = D.rows();
224 for (
unsigned i=0; i<n; ++i)
226 std::cerr << __FILE__
": square_root(): eigenvalue " << i <<
" is non-positive (" << D(i, i) <<
").\n";
231 return V * inv_sqrtD * V.transpose();
236 #undef VNL_SYMMETRIC_EIGENSYSTEM_INSTANTIATE 237 #define VNL_SYMMETRIC_EIGENSYSTEM_INSTANTIATE(T) \ 238 template class VNL_ALGO_EXPORT vnl_symmetric_eigensystem<T >; \ 239 template VNL_ALGO_EXPORT void vnl_symmetric_eigensystem_compute_eigenvals(T,T,T,T,T,T,T&,T&,T&); \ 240 template VNL_ALGO_EXPORT bool vnl_symmetric_eigensystem_compute(vnl_matrix<T > const&, vnl_matrix<T > &, vnl_vector<T >&) 242 #endif // vnl_symmetric_eigensystem_hxx_ unsigned int cols() const
Return the number of columns.
void assert_finite() const
abort if matrix contains any INFs or NANs.
void swap(double &a, double &b)
VNL_EXPORT void vnl_copy(S const *const src, T *const dst, const unsigned n)
Easy conversion between vectors and matrices templated over different types.
vnl_matrix< T > V
Public eigenvectors.
bool set_size(size_t n)
Resize to n elements.
vnl_diag_matrix< T > D
Public eigenvalues.
size_t size() const
Return the length, number of elements, dimension of this vector.
vnl_matrix< T > square_root() const
return the square root, if positive semi-definite.
Namespace with standard math functions.
vnl_symmetric_eigensystem(vnl_matrix< T > const &M)
Solve real symmetric eigensystem $A x = \lambda x$.
T get_eigenvalue(int i) const
Recover specified eigenvalue after computation.
bool vnl_symmetric_eigensystem_compute(vnl_matrix< T > const &A, vnl_matrix< T > &V, vnl_vector< T > &D)
Find eigenvalues of a symmetric matrix.
An ordinary mathematical matrix.
Declare in a central place the list of symbols from netlib.
Easy conversion between vectors and matrices templated over different types.
vnl_vector< T > get_eigenvector(int i) const
Recover specified eigenvector after computation.
vnl_decnum cube(vnl_decnum const &x)
Mathematical vector class, templated by type of element.
vnl_matrix< T > pinverse() const
return the pseudoinverse.
Find eigenvalues of a symmetric matrix.
T determinant() const
return product of eigenvalues.
stores a diagonal matrix as a single vector.
unsigned int rows() const
Return the number of rows.
vnl_matrix< T > inverse_square_root() const
return the inverse of the square root, if positive semi-definite.
vnl_vector< T > solve(vnl_vector< T > const &b)
Solve LS problem M x = b.
bool set_size(unsigned r, unsigned c)
Resize to r rows by c columns. Old data lost.
vnl_bignum sqr(vnl_bignum const &x)
void vnl_symmetric_eigensystem_compute_eigenvals(T M11, T M12, T M13, T M22, T M23, T M33, T &l1, T &l2, T &l3)
Find eigenvalues of a symmetric 3x3 matrix.