summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/matrix/matrix_expressions.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/matrix/matrix_expressions.h')
-rw-r--r--ml/dlib/dlib/matrix/matrix_expressions.h280
1 files changed, 280 insertions, 0 deletions
diff --git a/ml/dlib/dlib/matrix/matrix_expressions.h b/ml/dlib/dlib/matrix/matrix_expressions.h
new file mode 100644
index 000000000..9f057d076
--- /dev/null
+++ b/ml/dlib/dlib/matrix/matrix_expressions.h
@@ -0,0 +1,280 @@
+// Copyright (C) 2006 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_MATRIx_EXPRESSIONS_H_
+#define DLIB_MATRIx_EXPRESSIONS_H_
+
+#include "matrix_fwd.h"
+
+#ifdef _MSC_VER
+// This #pragma directive is also located in the algs.h file but for whatever
+// reason visual studio 9 just ignores it when it is only there.
+
+// this is to disable the "'this' : used in base member initializer list"
+// warning you get from some of the GUI objects since all the objects
+// require that their parent class be passed into their constructor.
+// In this case though it is totally safe so it is ok to disable this warning.
+#pragma warning(disable : 4355)
+#endif
+
+namespace dlib
+{
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+// Helper templates for making operators used by expression objects
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ template <typename T>
+ class matrix_range_exp;
+
+ template <typename T>
+ struct matrix_traits<matrix_range_exp<T> >
+ {
+ typedef T type;
+ typedef const T const_ret_type;
+ typedef default_memory_manager mem_manager_type;
+ typedef row_major_layout layout_type;
+ const static long NR = 1;
+ const static long NC = 0;
+ const static long cost = 1;
+ };
+
+ template <typename T>
+ class matrix_range_exp : public matrix_exp<matrix_range_exp<T> >
+ {
+ public:
+ typedef typename matrix_traits<matrix_range_exp>::type type;
+ typedef typename matrix_traits<matrix_range_exp>::const_ret_type const_ret_type;
+ typedef typename matrix_traits<matrix_range_exp>::mem_manager_type mem_manager_type;
+ const static long NR = matrix_traits<matrix_range_exp>::NR;
+ const static long NC = matrix_traits<matrix_range_exp>::NC;
+ const static long cost = matrix_traits<matrix_range_exp>::cost;
+ typedef typename matrix_traits<matrix_range_exp>::layout_type layout_type;
+
+
+ matrix_range_exp (
+ T start_,
+ T end_
+ )
+ {
+ start = start_;
+ if (start_ <= end_)
+ inc = 1;
+ else
+ inc = -1;
+ nc_ = std::abs(end_ - start_) + 1;
+ }
+ matrix_range_exp (
+ T start_,
+ T inc_,
+ T end_
+ )
+ {
+ start = start_;
+ nc_ = std::abs(end_ - start_)/inc_ + 1;
+ if (start_ <= end_)
+ inc = inc_;
+ else
+ inc = -inc_;
+ }
+
+ matrix_range_exp (
+ T start_,
+ T end_,
+ long num,
+ bool
+ )
+ {
+ start = start_;
+ nc_ = num;
+ if (num > 1)
+ {
+ inc = (end_-start_)/(num-1);
+ }
+ else
+ {
+ inc = 0;
+ start = end_;
+ }
+
+ }
+
+ const_ret_type operator() (
+ long,
+ long c
+ ) const { return start + c*inc; }
+
+ const_ret_type operator() (
+ long c
+ ) const { return start + c*inc; }
+
+ template <typename U>
+ bool aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ template <typename U>
+ bool destructively_aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ long nr (
+ ) const { return NR; }
+
+ long nc (
+ ) const { return nc_; }
+
+ long nc_;
+ T start;
+ T inc;
+ };
+
+// ----------------------------------------------------------------------------------------
+
+ template <typename T>
+ class matrix_log_range_exp;
+
+ template <typename T>
+ struct matrix_traits<matrix_log_range_exp<T> >
+ {
+ typedef T type;
+ typedef const T const_ret_type;
+ typedef default_memory_manager mem_manager_type;
+ typedef row_major_layout layout_type;
+ const static long NR = 1;
+ const static long NC = 0;
+ const static long cost = 1;
+ };
+
+ template <typename T>
+ class matrix_log_range_exp : public matrix_exp<matrix_log_range_exp<T> >
+ {
+ public:
+ typedef typename matrix_traits<matrix_log_range_exp>::type type;
+ typedef typename matrix_traits<matrix_log_range_exp>::const_ret_type const_ret_type;
+ typedef typename matrix_traits<matrix_log_range_exp>::mem_manager_type mem_manager_type;
+ const static long NR = matrix_traits<matrix_log_range_exp>::NR;
+ const static long NC = matrix_traits<matrix_log_range_exp>::NC;
+ const static long cost = matrix_traits<matrix_log_range_exp>::cost;
+ typedef typename matrix_traits<matrix_log_range_exp>::layout_type layout_type;
+
+
+ matrix_log_range_exp (
+ T start_,
+ T end_,
+ long num
+ )
+ {
+ start = start_;
+ nc_ = num;
+ if (num > 1)
+ {
+ inc = (end_-start_)/(num-1);
+ }
+ else
+ {
+ inc = 0;
+ start = end_;
+ }
+
+ }
+
+ const_ret_type operator() (
+ long,
+ long c
+ ) const { return std::pow((T)10,start + c*inc); }
+
+ const_ret_type operator() (
+ long c
+ ) const { return std::pow((T)10,start + c*inc); }
+
+ template <typename U>
+ bool aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ template <typename U>
+ bool destructively_aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ long nr (
+ ) const { return NR; }
+
+ long nc (
+ ) const { return nc_; }
+
+ long nc_;
+ T start;
+ T inc;
+ };
+
+// ----------------------------------------------------------------------------------------
+
+ template <long start, long inc_, long end>
+ class matrix_range_static_exp;
+
+ template <long start, long inc_, long end>
+ struct matrix_traits<matrix_range_static_exp<start,inc_,end> >
+ {
+ typedef long type;
+ typedef const long const_ret_type;
+ typedef default_memory_manager mem_manager_type;
+ const static long NR = 1;
+ const static long NC = tabs<(end - start)>::value/inc_ + 1;
+ const static long cost = 1;
+ typedef row_major_layout layout_type;
+ };
+
+ template <long start, long inc_, long end_>
+ class matrix_range_static_exp : public matrix_exp<matrix_range_static_exp<start,inc_,end_> >
+ {
+ public:
+ typedef typename matrix_traits<matrix_range_static_exp>::type type;
+ typedef typename matrix_traits<matrix_range_static_exp>::const_ret_type const_ret_type;
+ typedef typename matrix_traits<matrix_range_static_exp>::mem_manager_type mem_manager_type;
+ const static long NR = matrix_traits<matrix_range_static_exp>::NR;
+ const static long NC = matrix_traits<matrix_range_static_exp>::NC;
+ const static long cost = matrix_traits<matrix_range_static_exp>::cost;
+ typedef typename matrix_traits<matrix_range_static_exp>::layout_type layout_type;
+
+ const static long inc = (start <= end_)?inc_:-inc_;
+
+
+ matrix_range_static_exp (
+ ) {}
+
+ const_ret_type operator() (
+ long ,
+ long c
+ ) const { return start + c*inc; }
+
+ const_ret_type operator() (
+ long c
+ ) const { return start + c*inc; }
+
+ template <typename U>
+ bool aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ template <typename U>
+ bool destructively_aliases (
+ const matrix_exp<U>&
+ ) const { return false; }
+
+ long nr (
+ ) const { return NR; }
+
+ long nc (
+ ) const { return NC; }
+
+ };
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_MATRIx_EXPRESSIONS_H_
+