core/vnl/vnl_c_vector.h

Go to the documentation of this file.
00001 // This is core/vnl/vnl_c_vector.h
00002 #ifndef vnl_c_vector_h_
00003 #define vnl_c_vector_h_
00004 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00005 #pragma interface
00006 #endif
00007 //:
00008 //  \file
00009 //  \brief Math on blocks of memory
00010 //
00011 //    vnl_c_vector interfaces to lowlevel memory-block operations.
00012 //
00013 // \author Andrew W. Fitzgibbon, Oxford RRG
00014 // \date   12 Feb 98
00015 //
00016 // \verbatim
00017 // Modifications
00018 //     980212 AWF Initial version.
00019 //     LSB (Manchester) 26/3/01 Tidied documentation
00020 // \endverbatim
00021 //
00022 //-----------------------------------------------------------------------------
00023 
00024 #include <vcl_iosfwd.h>
00025 #include <vnl/vnl_numeric_traits.h>
00026 #include <vcl_cmath.h> // for vcl_sqrt
00027 
00028 // avoid messing about with aux_* functions for gcc 2.7 -- fsm
00029 template <class T, class S> void vnl_c_vector_one_norm(T const *p, unsigned n, S *out);
00030 template <class T, class S> void vnl_c_vector_two_norm(T const *p, unsigned n, S *out);
00031 template <class T, class S> void vnl_c_vector_inf_norm(T const *p, unsigned n, S *out);
00032 template <class T, class S> void vnl_c_vector_two_norm_squared(T const *p, unsigned n, S *out);
00033 template <class T, class S> void vnl_c_vector_rms_norm(T const *p, unsigned n, S *out);
00034 
00035 //: vnl_c_vector interfaces to lowlevel memory-block operations.
00036 export template <class T>
00037 class vnl_c_vector
00038 {
00039  public:
00040   typedef typename vnl_numeric_traits<T>::abs_t abs_t;
00041   typedef typename vnl_numeric_traits<T>::real_t real_t;
00042 
00043   static T sum(T const* v, unsigned n);
00044   static inline abs_t squared_magnitude(T const *p, unsigned n)
00045   { abs_t val; vnl_c_vector_two_norm_squared(p, n, &val); return val; }
00046   static void normalize(T *, unsigned n);
00047   static void apply(T const *, unsigned, T (*f)(T), T* v_out);
00048   static void apply(T const *, unsigned, T (*f)(T const&), T* v_out);
00049 
00050 
00051 //: y[i]  = x[i]
00052   static void copy    (T const *x, T       *y, unsigned);
00053 
00054 //:  y[i]  = a*x[i]
00055   static void scale   (T const *x, T       *y, unsigned, T const &);
00056 
00057 //: z[i]  = x[i] + y[i];
00058   static void add     (T const *x, T const *y, T *z, unsigned);
00059 
00060 //: z[i]  = x[i] + y;
00061   static void add     (T const *x, T const& y, T *z, unsigned);
00062 
00063 //: z[i]  = x[i] - y[i]
00064   static void subtract(T const *x, T const *y, T *z, unsigned);
00065 
00066 //: z[i]  = x[i] - y[i]
00067   static void subtract(T const *x, T const& y, T *z, unsigned);
00068 
00069 //: z[i]  = x[i] * y[i]
00070   static void multiply(T const *x, T const *y, T *z, unsigned);
00071 
00072 //: z[i]  = x[i] * y[i]
00073   static void multiply(T const *x, T const& y, T *z, unsigned);
00074 
00075 //: z[i]  = x[i] / y[i]
00076   static void divide  (T const *x, T const *y, T *z, unsigned);
00077 
00078 //: z[i]  = x[i] / y[i]
00079   static void divide  (T const *x, T const& y, T *z, unsigned);
00080 
00081 //: y[i]  = -x[i]
00082 // Note that this is a no-op when T is an unsigned type.
00083   static void negate  (T const *x, T       *y, unsigned);
00084 
00085 //: y[i]  = 1/x[i]
00086   static void invert  (T const *x, T       *y, unsigned);
00087 
00088 //:  y[i] += a*x[i]
00089   static void saxpy   (T const &a, T const *x, T *y, unsigned);
00090 
00091 //: x[i]  = v
00092   static void fill    (T *x, unsigned, T const &v);
00093 
00094 
00095   static void reverse (T *x, unsigned);
00096   static T dot_product  (T const *, T const *, unsigned);
00097 
00098 //: conjugate second
00099   static T inner_product(T const *, T const *, unsigned);
00100   static void conjugate(T const *, T *, unsigned);
00101 
00102   static T max_value(T const *, unsigned);
00103   static T min_value(T const *, unsigned);
00104 
00105   static T mean(T const *p, unsigned n) { return sum(p,n)/abs_t(n); }
00106  
00107   //: The standard deviation 
00108   // This method uses the 1/(n-1) normalisation, assuming that your
00109   // data is a sample of a population.
00110   static inline real_t std(T const *p, unsigned n) {
00111     return vcl_sqrt(real_t(sum_sq_diff_means(p, n))/real_t(abs_t(n-1)));}
00112 
00113   //: The sum of squared differences from the mean
00114   static T sum_sq_diff_means(T const* v, unsigned n);
00115 
00116   //:  one_norm : sum of abs values
00117   static inline abs_t one_norm(T const *p, unsigned n)
00118   { abs_t val; vnl_c_vector_one_norm(p, n, &val); return val; }
00119 
00120   //: two_norm : sqrt of sum of squared abs values
00121   static inline abs_t two_norm(T const *p, unsigned n)
00122   { abs_t val; vnl_c_vector_two_norm(p, n, &val); return val; }
00123 
00124  //: inf_norm : max of abs values
00125   static inline abs_t inf_norm(T const *p, unsigned n)
00126   { abs_t val; vnl_c_vector_inf_norm(p, n, &val); return val; }
00127 
00128   //: two_nrm2 : sum of squared abs values
00129   static inline abs_t two_nrm2(T const *p, unsigned n)
00130   { abs_t val; vnl_c_vector_two_norm_squared(p, n, &val); return val; }
00131 
00132   //: rms_norm : sqrt of mean sum of squared abs values
00133   static inline abs_t rms_norm(T const *p, unsigned n)
00134   { abs_t val; vnl_c_vector_rms_norm(p, n, &val); return val; }
00135 
00136   //: Euclidean Distance between two vectors.
00137   // Sum of Differences squared.
00138   static T euclid_dist_sq(T const *, T const *, unsigned);
00139 
00140   //: Memory allocation
00141   static T** allocate_Tptr(int n);
00142   static T*  allocate_T(int n);
00143   static void deallocate(T**, int n_when_allocated);
00144   static void deallocate(T*, int n_when_allocated);
00145 };
00146 
00147 //: Input & output
00148 // \relates vnl_c_vector
00149 template <class T>
00150 vcl_ostream& print_vector(vcl_ostream&, T const*, unsigned);
00151 
00152 #endif // vnl_c_vector_h_

Generated on Fri Nov 21 05:06:13 2008 for core/vnl by  doxygen 1.5.1