2 #ifndef vnl_c_vector_hxx_ 3 #define vnl_c_vector_hxx_ 33 for (
unsigned i = 0; i < n; ++i)
38 for (
unsigned i = 0; i < n; ++i)
46 for (
unsigned i = 0; i < n; ++i)
53 for (
unsigned i = 0; i < n; ++i)
60 for (
unsigned i=0; i<n; ++i)
69 for (
unsigned i=0; i<n; ++i)
72 for (
unsigned i=0; i<n; ++i)
77 #ifndef DOXYGEN_SHOULD_SKIP_THIS 78 #define impl_elmt_wise_commutative(op) \ 80 for (unsigned i=0; i<n; ++i) \ 83 for (unsigned i=0; i<n; ++i) \ 86 for (unsigned i=0; i<n; ++i) \ 89 #define impl_elmt_wise_non_commutative(op) \ 91 for (unsigned i=0; i<n; ++i) \ 94 for (unsigned i=0; i<n; ++i) \ 97 #define impl_elmt_wise_commutative_a(op) \ 99 for (unsigned i=0; i<n; ++i) \ 102 for (unsigned i=0; i<n; ++i) \ 105 #define impl_elmt_wise_non_commutative_a(op) \ 107 for (unsigned i=0; i<n; ++i) \ 110 for (unsigned i=0; i<n; ++i) \ 112 #endif // DOXYGEN_SHOULD_SKIP_THIS 117 impl_elmt_wise_commutative(+);
123 impl_elmt_wise_commutative_a(+);
129 impl_elmt_wise_non_commutative(-);
135 impl_elmt_wise_commutative_a(-);
141 impl_elmt_wise_commutative(*);
147 impl_elmt_wise_commutative_a(*);
153 impl_elmt_wise_non_commutative(/);
159 impl_elmt_wise_commutative_a(/);
162 #undef impl_elmt_wise_commutative 163 #undef impl_elmt_wise_noncommutative 170 for (
unsigned i=0; i<n; ++i)
173 for (
unsigned i=0; i<n; ++i)
181 for (
unsigned i=0; i<n; ++i)
184 for (
unsigned i=0; i<n; ++i)
192 for (
unsigned i=0; i<n; ++i)
200 for (
unsigned i=0; i<n; ++i)
207 for (
unsigned i=0; 2*i+1<n; ++i) {
226 for (
unsigned i=0; i<n; ++i)
235 for (
unsigned i=0; i<n; ++i)
285 for (
unsigned i = 0; i < n; ++i, ++
v)
291 return sum_sq - sum*sum /
abs_t(n);
296 template <
class T,
class S>
308 template <
class T,
class S>
314 *out = S(std::sqrt(real_t(*out)));
317 template <
class T,
class S>
326 template <
class T,
class S>
331 *out = S(std::sqrt(real_t(*out)));
334 template <
class T,
class S>
375 # include <vcl_msvc_warnings.h> 379 for (std::size_t i=0; i<n; ++i)
392 for (std::size_t i=0; i<n; ++i)
419 std::ostream&
print_vector(std::ostream& s, T
const*
v,
unsigned size)
421 if (size != 0) s <<
v[0];
422 for (
unsigned i = 1; i < size; ++i)
429 #define VNL_C_VECTOR_INSTANTIATE_norm(T, S) \ 430 template VNL_EXPORT void vnl_c_vector_two_norm_squared(T const *, unsigned, S *); \ 431 template VNL_EXPORT void vnl_c_vector_rms_norm(T const *, unsigned, S *); \ 432 template VNL_EXPORT void vnl_c_vector_one_norm(T const *, unsigned, S *); \ 433 template VNL_EXPORT void vnl_c_vector_two_norm(T const *, unsigned, S *); \ 434 template VNL_EXPORT void vnl_c_vector_inf_norm(T const *, unsigned, S *) 436 #undef VNL_C_VECTOR_INSTANTIATE_ordered 437 #define VNL_C_VECTOR_INSTANTIATE_ordered(T) \ 438 VNL_C_VECTOR_INSTANTIATE_norm(T, vnl_c_vector<T >::abs_t); \ 439 template class vnl_c_vector<T >; \ 440 template VNL_EXPORT std::ostream& print_vector(std::ostream &,T const *,unsigned) 442 #undef VNL_C_VECTOR_INSTANTIATE_unordered 443 #define VNL_C_VECTOR_INSTANTIATE_unordered(T) \ 444 template <> T vnl_c_vector<T >::max_value(T const *, unsigned) { return T(0); } \ 445 template <> T vnl_c_vector<T >::min_value(T const *, unsigned) { return T(0); } \ 446 template <> unsigned vnl_c_vector<T >::arg_max(T const *, unsigned) { return 0U; } \ 447 template <> unsigned vnl_c_vector<T >::arg_min(T const *, unsigned) { return 0U; } \ 448 template class vnl_c_vector<T >; \ 449 VNL_C_VECTOR_INSTANTIATE_norm(T, vnl_c_vector<T >::abs_t); 451 #ifndef DOXYGEN_SHOULD_SKIP_THIS 452 #undef VNL_C_VECTOR_INSTANTIATE 453 #define VNL_C_VECTOR_INSTANTIATE(T) extern "no such macro; use e.g. VNL_C_VECTOR_INSTANTIATE_ordered instead" 454 #endif // DOXYGEN_SHOULD_SKIP_THIS 456 #endif // vnl_c_vector_hxx_ static void deallocate(T **, const std::size_t n_when_allocated)
static VNL_SSE_FORCE_INLINE T min(const T *v, unsigned n)
static void conjugate(T const *, T *, unsigned)
static VNL_SSE_FORCE_INLINE T euclid_dist_sq(const T *x, const T *y, unsigned n)
static void copy(T const *x, T *y, unsigned)
y[i] = x[i].
static unsigned arg_min(T const *, unsigned)
Returns location of min value of the vector.
static void saxpy(T const &a, T const *x, T *y, unsigned)
y[i] += a*x[i].
static VNL_SSE_FORCE_INLINE unsigned arg_min(const T *v, unsigned n)
VNL_EXPORT std::ostream & print_vector(std::ostream &, T const *, unsigned)
Input & output.
Templated zero/one/precision.
To allow templated algorithms to determine appropriate actions of conjugation, complexification etc.
Support for Streaming SIMD Extensions to speed up vector arithmetic.
static T sum(T const *v, unsigned n)
VNL_SSE_FORCE_INLINE void vnl_sse_dealloc(void *mem, std::size_t n, unsigned size)
Custom memory deallocation function to free 16 byte aligned of data.
static VNL_SSE_FORCE_INLINE T dot_product(const T *x, const T *y, unsigned n)
Namespace with standard math functions.
void vnl_c_vector_two_norm(T const *p, unsigned n, S *out)
void * vnl_c_vector_alloc(std::size_t n, unsigned size)
vnl_numeric_traits< T >::real_t real_t
vnl_bignum squared_magnitude(vnl_bignum const &x)
static void divide(T const *x, T const *y, T *z, unsigned)
z[i] = x[i] / y[i].
static void apply(T const *, unsigned, T(*f)(T), T *v_out)
static VNL_SSE_FORCE_INLINE T sum(const T *v, unsigned n)
static void negate(T const *x, T *y, unsigned)
y[i] = -x[i].
static void reverse(T *x, unsigned)
void vnl_c_vector_two_norm_squared(T const *p, unsigned n, S *out)
static T sum_sq_diff_means(T const *v, unsigned n)
The sum of squared differences from the mean.
static unsigned arg_max(T const *, unsigned)
Returns location of max value of the vector.
static void fill(T *x, unsigned, T const &v)
x[i] = v.
static T min_value(T const *, unsigned)
Returns min value of the vector.
static T * allocate_T(const std::size_t n)
VNL_SSE_FORCE_INLINE void * vnl_sse_alloc(std::size_t n, unsigned size)
Custom memory allocation function to force 16 byte alignment of data.
void vnl_c_vector_one_norm(T const *p, unsigned n, S *out)
static T inner_product(T const *, T const *, unsigned)
conjugate second.
static T ** allocate_Tptr(const std::size_t n)
Memory allocation.
void vnl_c_vector_dealloc(void *v, std::size_t n, unsigned size)
vnl_numeric_traits< T >::abs_t abs_t
static T euclid_dist_sq(T const *, T const *, unsigned)
Euclidean Distance between two vectors.
static void normalize(T *, unsigned n)
vnl_bignum abs(vnl_bignum const &x)
void vnl_c_vector_inf_norm(T const *p, unsigned n, S *out)
static VNL_SSE_FORCE_INLINE T max(const T *v, unsigned n)
void vnl_c_vector_construct(T *p, std::size_t n)
void vnl_c_vector_rms_norm(T const *p, unsigned n, S *out)
static VNL_SSE_FORCE_INLINE unsigned arg_max(const T *v, unsigned n)
static T max_value(T const *, unsigned)
Returns max value of the vector.
static void subtract(T const *x, T const *y, T *z, unsigned)
z[i] = x[i] - y[i].
static void invert(T const *x, T *y, unsigned)
y[i] = 1/x[i].
static void add(T const *x, T const *y, T *z, unsigned)
z[i] = x[i] + y[i];.
static T dot_product(T const *, T const *, unsigned)
static void multiply(T const *x, T const *y, T *z, unsigned)
z[i] = x[i] * y[i].
void vnl_c_vector_destruct(T *p, std::size_t n)
Math on blocks of memory.
static void scale(T const *x, T *y, unsigned, T const &)
y[i] = a*x[i].