core/vnl/vnl_c_na_vector.h
Go to the documentation of this file.
00001 // This is core/vnl/vnl_c_na_vector.h
00002 #ifndef vnl_c_na_vector_h_
00003 #define vnl_c_na_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 //    NA aware vnl_c_vector-like interfaces to lowlevel memory-block operations.
00012 //
00013 // \author Andrew W. Fitzgibbon, Ian Scott
00014 // \date   3 Nov 2010
00015 //
00016 // \verbatim
00017 //  Modifications
00018 // \endverbatim
00019 //
00020 //-----------------------------------------------------------------------------
00021 
00022 #include <vcl_iosfwd.h>
00023 #include <vnl/vnl_numeric_traits.h>
00024 #include <vcl_cmath.h> // for vcl_sqrt
00025 
00026 // avoid messing about with aux_* functions for gcc 2.7 -- fsm
00027 #if 0
00028 template <class T, class S> void vnl_c_na_vector_inf_norm(T const *p, unsigned n, S *out);
00029 template <class T, class S> void vnl_c_na_vector_rms_norm(T const *p, unsigned n, S *out);
00030 #endif
00031 template <class T, class S> void vnl_c_na_vector_one_norm(T const *p, unsigned n, S *out);
00032 template <class T, class S> void vnl_c_na_vector_two_norm(T const *p, unsigned n, S *out);
00033 template <class T, class S> void vnl_c_na_vector_two_norm_squared(T const *p, unsigned n, S *out);
00034 
00035 //: vnl_c_na_vector interfaces to NA-aware lowlevel memory-block operations.
00036 export template <class T>
00037 class vnl_c_na_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_na_vector_two_norm_squared(p, n, &val); return val; }
00046 #if 0
00047   static void normalize(T *, unsigned n);
00048   static void apply(T const *, unsigned, T (*f)(T), T* v_out);
00049   static void apply(T const *, unsigned, T (*f)(T const&), T* v_out);
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   static unsigned arg_max(T const *, unsigned);
00105   static unsigned arg_min(T const *, unsigned);
00106 #endif
00107 
00108   static T mean(T const *p, unsigned n);
00109 
00110 #if 0
00111   //: The standard deviation
00112   // This method uses the 1/(n-1) normalisation, assuming that your
00113   // data is a sample of a population.
00114   static inline real_t std(T const *p, unsigned n) {
00115     return vcl_sqrt(real_t(sum_sq_diff_means(p, n))/real_t(abs_t(n-1)));}
00116 
00117   //: The sum of squared differences from the mean
00118   static T sum_sq_diff_means(T const* v, unsigned n);
00119 #endif
00120 
00121   //:  one_norm : sum of abs values
00122   static inline abs_t one_norm(T const *p, unsigned n)
00123   { abs_t val; vnl_c_na_vector_one_norm(p, n, &val); return val; }
00124 
00125   //: two_norm : sqrt of sum of squared abs values
00126   static inline abs_t two_norm(T const *p, unsigned n)
00127   { abs_t val; vnl_c_na_vector_two_norm(p, n, &val); return val; }
00128 
00129   //: two_nrm2 : sum of squared abs values
00130   static inline abs_t two_nrm2(T const *p, unsigned n)
00131   { abs_t val; vnl_c_na_vector_two_norm_squared(p, n, &val); return val; }
00132 
00133 #if 0
00134  //: inf_norm : max of abs values
00135   static inline abs_t inf_norm(T const *p, unsigned n)
00136   { abs_t val; vnl_c_na_vector_inf_norm(p, n, &val); return val; }
00137 
00138   //: rms_norm : sqrt of mean sum of squared abs values
00139   static inline abs_t rms_norm(T const *p, unsigned n)
00140   { abs_t val; vnl_c_na_vector_rms_norm(p, n, &val); return val; }
00141 
00142   //: Euclidean Distance between two vectors.
00143   // Sum of Differences squared.
00144   static T euclid_dist_sq(T const *, T const *, unsigned);
00145 #endif
00146 };
00147 
00148 //: Input & output
00149 // \relatesalso vnl_c_na_vector
00150 template <class T>
00151 vcl_ostream& print_na_vector(vcl_ostream&, T const*, unsigned);
00152 
00153 #endif // vnl_c_na_vector_h_