00001
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
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <vcl_iosfwd.h>
00023 #include <vnl/vnl_numeric_traits.h>
00024 #include <vcl_cmath.h>
00025
00026
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
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
00052 static void copy (T const *x, T *y, unsigned);
00053
00054
00055 static void scale (T const *x, T *y, unsigned, T const &);
00056
00057
00058 static void add (T const *x, T const *y, T *z, unsigned);
00059
00060
00061 static void add (T const *x, T const& y, T *z, unsigned);
00062
00063
00064 static void subtract(T const *x, T const *y, T *z, unsigned);
00065
00066
00067 static void subtract(T const *x, T const& y, T *z, unsigned);
00068
00069
00070 static void multiply(T const *x, T const *y, T *z, unsigned);
00071
00072
00073 static void multiply(T const *x, T const& y, T *z, unsigned);
00074
00075
00076 static void divide (T const *x, T const *y, T *z, unsigned);
00077
00078
00079 static void divide (T const *x, T const& y, T *z, unsigned);
00080
00081
00082
00083 static void negate (T const *x, T *y, unsigned);
00084
00085
00086 static void invert (T const *x, T *y, unsigned);
00087
00088
00089 static void saxpy (T const &a, T const *x, T *y, unsigned);
00090
00091
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
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
00112
00113
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
00118 static T sum_sq_diff_means(T const* v, unsigned n);
00119 #endif
00120
00121
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
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
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
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
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
00143
00144 static T euclid_dist_sq(T const *, T const *, unsigned);
00145 #endif
00146 };
00147
00148
00149
00150 template <class T>
00151 vcl_ostream& print_na_vector(vcl_ostream&, T const*, unsigned);
00152
00153 #endif // vnl_c_na_vector_h_