vnl_c_vector.h
Go to the documentation of this file.
1 // This is core/vnl/vnl_c_vector.h
2 #ifndef vnl_c_vector_h_
3 #define vnl_c_vector_h_
4 //:
5 // \file
6 // \brief Math on blocks of memory
7 //
8 // vnl_c_vector interfaces to low-level memory-block operations.
9 //
10 // \author Andrew W. Fitzgibbon, Oxford RRG
11 // \date 12 Feb 1998
12 //
13 // \verbatim
14 // Modifications
15 // 1998-02-12 AWF Initial version.
16 // 2001-03-26 LSB (Manchester) Tidied documentation
17 // 2009-03-30 Peter Vanroose added arg_min() and arg_max()
18 // \endverbatim
19 //
20 //-----------------------------------------------------------------------------
21 
22 #include <iosfwd>
23 #include <cstddef>
24 #include <cmath>
25 #ifdef _MSC_VER
26 # include <vcl_msvc_warnings.h>
27 #endif
28 #include <vnl/vnl_numeric_traits.h>
29 #include <vnl/vnl_export.h>
30 
31 // avoid messing about with aux_* functions for gcc 2.7 -- fsm
32 template <class T, class S> VNL_EXPORT void vnl_c_vector_one_norm(T const *p, unsigned n, S *out);
33 template <class T, class S> VNL_EXPORT void vnl_c_vector_two_norm(T const *p, unsigned n, S *out);
34 template <class T, class S> VNL_EXPORT void vnl_c_vector_inf_norm(T const *p, unsigned n, S *out);
35 template <class T, class S> VNL_EXPORT void vnl_c_vector_two_norm_squared(T const *p, unsigned n, S *out);
36 template <class T, class S> VNL_EXPORT void vnl_c_vector_rms_norm(T const *p, unsigned n, S *out);
37 
38 //: vnl_c_vector interfaces to lowlevel memory-block operations.
39 template <class T>
40 class VNL_EXPORT vnl_c_vector
41 {
42  public:
44  typedef typename vnl_numeric_traits<T>::real_t real_t;
45 
46  static T sum(T const* v, unsigned n);
47  static inline abs_t squared_magnitude(T const *p, unsigned n)
48  { abs_t val; vnl_c_vector_two_norm_squared(p, n, &val); return val; }
49  static void normalize(T *, unsigned n);
50  static void apply(T const *, unsigned, T (*f)(T), T* v_out);
51  static void apply(T const *, unsigned, T (*f)(T const&), T* v_out);
52 
53  //: y[i] = x[i]
54  static void copy (T const *x, T *y, unsigned);
55 
56  //: y[i] = a*x[i]
57  static void scale (T const *x, T *y, unsigned, T const &);
58 
59  //: z[i] = x[i] + y[i];
60  static void add (T const *x, T const *y, T *z, unsigned);
61 
62  //: z[i] = x[i] + y;
63  static void add (T const *x, T const& y, T *z, unsigned);
64 
65  //: z[i] = x[i] - y[i]
66  static void subtract(T const *x, T const *y, T *z, unsigned);
67 
68  //: z[i] = x[i] - y[i]
69  static void subtract(T const *x, T const& y, T *z, unsigned);
70 
71  //: z[i] = x[i] * y[i]
72  static void multiply(T const *x, T const *y, T *z, unsigned);
73 
74  //: z[i] = x[i] * y[i]
75  static void multiply(T const *x, T const& y, T *z, unsigned);
76 
77  //: z[i] = x[i] / y[i]
78  static void divide (T const *x, T const *y, T *z, unsigned);
79 
80  //: z[i] = x[i] / y[i]
81  static void divide (T const *x, T const& y, T *z, unsigned);
82 
83  //: y[i] = -x[i]
84  // Note that this is a no-op when T is an unsigned type.
85  static void negate (T const *x, T *y, unsigned);
86 
87  //: y[i] = 1/x[i]
88  static void invert (T const *x, T *y, unsigned);
89 
90  //: y[i] += a*x[i]
91  static void saxpy (T const &a, T const *x, T *y, unsigned);
92 
93  //: x[i] = v
94  static void fill (T *x, unsigned, T const &v);
95 
96 
97  static void reverse (T *x, unsigned);
98  static T dot_product (T const *, T const *, unsigned);
99 
100  //: conjugate second
101  static T inner_product(T const *, T const *, unsigned);
102  static void conjugate(T const *, T *, unsigned);
103 
104  static T max_value(T const *, unsigned);
105  static T min_value(T const *, unsigned);
106  static unsigned arg_max(T const *, unsigned);
107  static unsigned arg_min(T const *, unsigned);
109  static T mean(T const *p, unsigned n) { return T(sum(p,n)/abs_t(n)); }
110 
111  //: The standard deviation
112  // This method uses the 1/(n-1) normalisation, assuming that your
113  // data is a sample of a population.
114  static inline real_t std(T const *p, unsigned n) {
115  return std::sqrt(real_t(sum_sq_diff_means(p, n))/real_t(abs_t(n-1)));}
116 
117  //: The sum of squared differences from the mean
118  static T sum_sq_diff_means(T const* v, unsigned n);
119 
120  //: one_norm : sum of abs values
121  static inline abs_t one_norm(T const *p, unsigned n)
122  { abs_t val; vnl_c_vector_one_norm(p, n, &val); return val; }
123 
124  //: two_norm : sqrt of sum of squared abs values
125  static inline abs_t two_norm(T const *p, unsigned n)
126  { abs_t val; vnl_c_vector_two_norm(p, n, &val); return val; }
127 
128  //: inf_norm : max of abs values
129  static inline abs_t inf_norm(T const *p, unsigned n)
130  { abs_t val; vnl_c_vector_inf_norm(p, n, &val); return val; }
131 
132  //: two_nrm2 : sum of squared abs values
133  static inline abs_t two_nrm2(T const *p, unsigned n)
134  { abs_t val; vnl_c_vector_two_norm_squared(p, n, &val); return val; }
135 
136  //: rms_norm : sqrt of mean sum of squared abs values
137  static inline abs_t rms_norm(T const *p, unsigned n)
138  { abs_t val; vnl_c_vector_rms_norm(p, n, &val); return val; }
139 
140  //: Euclidean Distance between two vectors.
141  // Sum of Differences squared.
142  static T euclid_dist_sq(T const *, T const *, unsigned);
143 
144  //: Memory allocation
145  static T** allocate_Tptr(const std::size_t n);
146  static T* allocate_T(const std::size_t n);
147  static void deallocate(T**, const std::size_t n_when_allocated);
148  static void deallocate(T*, const std::size_t n_when_allocated);
149 };
150 
151 //: Input & output
152 // \relatesalso vnl_c_vector
153 template <class T> VNL_EXPORT
154 std::ostream& print_vector(std::ostream&, T const*, unsigned);
155 
156 #endif // vnl_c_vector_h_
VNL_EXPORT T dot_product(m const &, m const &)
VNL_EXPORT std::ostream & print_vector(std::ostream &, T const *, unsigned)
Input & output.
Templated zero/one/precision.
VNL_EXPORT void vnl_c_vector_rms_norm(T const *p, unsigned n, S *out)
vnl_c_vector interfaces to lowlevel memory-block operations.
Definition: vnl_c_vector.h:39
VNL_EXPORT void vnl_c_vector_inf_norm(T const *p, unsigned n, S *out)
void add(const vnl_bignum &b1, const vnl_bignum &b2, vnl_bignum &sum)
add two non-infinite vnl_bignum values and save their sum.
Definition: vnl_bignum.cxx:887
vnl_numeric_traits< T >::real_t real_t
Definition: vnl_c_vector.h:43
vnl_bignum squared_magnitude(vnl_bignum const &x)
Definition: vnl_bignum.h:433
#define v
Definition: vnl_vector.h:42
void subtract(const vnl_bignum &bmax, const vnl_bignum &bmin, vnl_bignum &diff)
subtract bmin from bmax (unsigned, non-infinite), result in diff.
Definition: vnl_bignum.cxx:947
Data normalize(const vnl_bignum &b1, const vnl_bignum &b2, vnl_bignum &u, vnl_bignum &v)
normalize two vnl_bignums.
VNL_EXPORT T inner_product(m const &, m const &)
vnl_numeric_traits< T >::abs_t abs_t
Definition: vnl_c_vector.h:42
VNL_EXPORT void vnl_c_vector_one_norm(T const *p, unsigned n, S *out)
void divide(const vnl_bignum &b1, const vnl_bignum &b2, vnl_bignum &q, vnl_bignum &r)
divide b2 into b1, getting quotient q and remainder r.
VNL_EXPORT void vnl_c_vector_two_norm(T const *p, unsigned n, S *out)
VNL_EXPORT void vnl_c_vector_two_norm_squared(T const *p, unsigned n, S *out)