00001 #ifndef vnl_scatter_3x3_h_
00002 #define vnl_scatter_3x3_h_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <vnl/vnl_matrix_fixed.h>
00015 #include <vnl/vnl_vector_fixed.h>
00016
00017 template <class T>
00018 class vnl_scatter_3x3 : public vnl_matrix_fixed<T,3,3> {
00019 public:
00020 typedef vnl_matrix_fixed<T,3,3> base;
00021 typedef vnl_vector_fixed<T,3> vect;
00022
00023
00024 vnl_scatter_3x3();
00025
00026
00027 void add_outer_product(const vnl_vector_fixed<T,3> & v);
00028
00029
00030 void add_outer_product(const vnl_vector_fixed<T,3> & u,
00031 const vnl_vector_fixed<T,3> & v);
00032
00033
00034 void sub_outer_product(const vnl_vector_fixed<T,3> & v);
00035
00036
00037 void sub_outer_product(const vnl_vector_fixed<T,3> & u,
00038 const vnl_vector_fixed<T,3> & v);
00039
00040
00041 void force_symmetric();
00042
00043
00044 void compute_eigensystem();
00045
00046
00047 vnl_vector_fixed<T,3> minimum_eigenvector() {
00048 if (!eigenvectors_currentp) compute_eigensystem();
00049 return vnl_vector_fixed<T,3>(V_(0,0), V_(1,0), V_(2,0));
00050 }
00051
00052
00053
00054 vnl_matrix_fixed<T,3,3>& V() {
00055 if (!eigenvectors_currentp) compute_eigensystem();
00056 return V_;
00057 }
00058
00059 protected:
00060 bool symmetricp;
00061 bool eigenvectors_currentp;
00062 vnl_matrix_fixed<T,3,3> V_;
00063 vnl_vector_fixed<T,3> D;
00064 };
00065
00066
00067 #endif // vnl_scatter_3x3_h_