23 #ifndef SRC_TYPES_MATRIX_HPP_ 
   24 #define SRC_TYPES_MATRIX_HPP_ 
   26 #include <Eigen/Dense> 
   30 #include <boost/serialization/serialization.hpp> 
   32 #include <boost/serialization/vector.hpp> 
   34 #include <boost/serialization/array.hpp> 
   35 #include <boost/serialization/version.hpp> 
   39 namespace serialization {
 
   64 class Matrix : 
public Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> {
 
   72         Eigen::
Matrix<T, Eigen::Dynamic, Eigen::Dynamic>() {
 
   82         Eigen::
Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(Rows_, Cols_) {
 
   91     Matrix(
const Eigen::Matrix<T, Eigen::Dynamic, 1>& vector_) :
 
   92         Eigen::
Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(vector_.size(), 1)
 
   95         memcpy(this->data(), vector_.data(), vector_.size() * 
sizeof(T));
 
  103     Matrix(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& matrix_) :
 
  104         Eigen::
Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(matrix_.rows(), matrix_.cols())
 
  107         memcpy(this->data(), matrix_.data(), matrix_.size() * 
sizeof(T));
 
  117         Eigen::
Matrix<T, Eigen::Dynamic, Eigen::Dynamic>(tensor_.dim(1), tensor_.dim(0))
 
  120         assert(tensor_.
dims().size() == 2);
 
  122         memcpy(this->data(), tensor_.
data(), tensor_.
size() * 
sizeof(T));
 
  149     Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& 
operator =(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat_) {
 
  151         Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::operator=(mat_);
 
  162     Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> 
operator *(
const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& mat_) {
 
  165         return Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::operator*(mat_);
 
  175         T* data_ptr = this->data();
 
  177 #pragma omp parallel for 
  178         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++)
 
  179             data_ptr[i] = value_;
 
  187         T* data_ptr = this->data();
 
  189 #pragma omp parallel for 
  190         for (
size_t i = 0; i < (size_t)this->size(); i++)
 
  199     void randn(T mean = 0, T stddev = 1) {
 
  202         std::random_device rd;
 
  203         std::mt19937 mt(rd());
 
  204         std::normal_distribution<T> dist(mean, stddev);
 
  207         T* data_ptr = this->data();
 
  209 #pragma omp parallel for 
  210         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++) {
 
  211             data_ptr[i] = (T)dist(mt);
 
  221     void rand(T min = 0, T max = 1) {
 
  224         std::random_device rd;
 
  225         std::mt19937 mt(rd());
 
  226         std::uniform_real_distribution<T> dist(min, max);
 
  229         T* data_ptr = this->data();
 
  231 #pragma omp parallel for 
  232         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++) {
 
  233             data_ptr[i] = (T)dist(rd);
 
  245         T* data_ptr = this->data();
 
  248 #pragma omp parallel for 
  249         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++) {
 
  250             data_ptr[i] = (*func)(data_ptr[i]);
 
  262         T* data_ptr = this->data();
 
  265 #pragma omp parallel for 
  266         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++) {
 
  267             data_ptr[i] = (*func)(data_ptr[i], scalar_);
 
  279         if ((this->rows() != mat_.rows()) || (this->cols() != mat_.cols()))
 
  280             printf(
"elementwiseFunctionMatrix: dimensions mismatch!\n");
 
  283         T* data_ptr = this->data();
 
  284         T* m_data_ptr = mat_.data();
 
  287 #pragma omp parallel for 
  288         for (
size_t i = 0; i < (size_t) (this->rows() * this->cols()); i++) {
 
  289             data_ptr[i] = (*func)(data_ptr[i], m_data_ptr[i]);
 
  300             Eigen::Matrix<T, Eigen::Dynamic, 1>& v_) {
 
  302         if (this->rows() != v_.cols())
 
  303             printf(
"matrixColumnVectorFunction: dimensions mismatch\n");
 
  311 #pragma omp parallel for 
  312         for (
size_t x = 0; x < (size_t)this->cols(); x++) {
 
  313             for (
size_t y = 0; y < (size_t)this->rows(); y++) {
 
  315                 (*this)(y, x) = (*func)((*this)(y, x), v_(y));
 
  327         if (this->cols() != v_.cols())
 
  328             printf(
"matrixRowVectorFunction: dimensions mismatch\n");
 
  336 #pragma omp parallel for 
  337         for (
size_t x = 0; x < (size_t)this->cols(); x++) {
 
  338             for (
size_t y = 0; y < (size_t)this->rows(); y++) {
 
  341                 (*this)(y, x) = (*func)((*this)(y, x), v_(x));
 
  353 #pragma omp parallel for 
  354         for (
size_t x = 0; x < (size_t)this->cols(); x++) {
 
  355             for (
size_t y = 0; y < (size_t)this->rows(); y++) {
 
  357                 (*this)(y, x) = in(y);
 
  368         Eigen::Matrix<T, Eigen::Dynamic, 1> indices((*this).cols());
 
  370         for (
size_t i = 0; i < (size_t)(*this).cols(); i++) {
 
  375             for (
size_t j = 0; j < (size_t)(*this).rows(); j++) {
 
  377                 if (j == 0 || (*
this)(j, i) > current_max_val) {
 
  380                     current_max_val = (*this)(j, i);
 
  399         Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> error(this->rows(), this->cols());
 
  402         error.array() = - (this->unaryExpr(std::ptr_fun(::logf)).array() * targets_.array());
 
  420         return this->data()[idx];
 
  424         return this->data()[idx];
 
  437     template<
class Archive>
 
  438     void save(Archive & ar, 
const unsigned int version)
 const {
 
  445         size_t elements = (size_t)(this->rows() * this->cols());
 
  446         T* data_ptr = (T*)this->data();
 
  447         ar & boost::serialization::make_array<T>(data_ptr, elements);
 
  455      template<
class Archive>
 
  456      void load(Archive & ar, 
const unsigned int version) {
 
  461         this->resize(rows, cols);
 
  463         size_t elements = (size_t)(this->rows() * this->cols());
 
  464         T* data_ptr = this->data();
 
  465         ar & boost::serialization::make_array<T>(data_ptr, elements);
 
  469      BOOST_SERIALIZATION_SPLIT_MEMBER()
 
  479 using MatrixPtr = 
typename std::shared_ptr< mic::types::Matrix<T> >;
 
  488 BOOST_CLASS_VERSION(mic::types::Matrix<
short>, 1)
 
  489 BOOST_CLASS_VERSION(mic::types::Matrix<
int>, 1)
 
  490 BOOST_CLASS_VERSION(mic::types::Matrix<
long>, 1)
 
  491 BOOST_CLASS_VERSION(mic::types::Matrix<
float>, 1)
 
  492 BOOST_CLASS_VERSION(mic::types::Matrix<
double>, 1)
 
void randn(T mean=0, T stddev=1)
 
EIGEN_STRONG_INLINE Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > operator*(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat_)
 
void load(Archive &ar, const unsigned int version)
 
EIGEN_STRONG_INLINE Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > & operator=(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat_)
 
EIGEN_STRONG_INLINE Matrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &matrix_)
 
EIGEN_STRONG_INLINE Matrix(mic::types::Tensor< T > &tensor_)
 
T calculateCrossEntropy(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &targets_)
 
void elementwiseFunctionMatrix(T(*func)(T, T), Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat_)
 
void save(Archive &ar, const unsigned int version) const 
 
EIGEN_STRONG_INLINE Matrix()
 
Eigen::Matrix< T, Eigen::Dynamic, 1 > colwiseReturnMaxIndices()
 
void rand(T min=0, T max=1)
 
void matrixRowVectorFunction(T(*func)(T, T), Eigen::Matrix< T, Eigen::Dynamic, 1 > &v_)
 
typename std::shared_ptr< mic::types::Matrix< T > > MatrixPtr
Typedef for a shared pointer to template-typed dynamic matrices. 
 
void elementwiseFunctionScalar(T(*func)(T, T), T scalar_)
 
EIGEN_STRONG_INLINE Matrix(int Rows_, int Cols_)
 
EIGEN_STRONG_INLINE Matrix(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &vector_)
 
void matrixColumnVectorFunction(T(*func)(T, T), Eigen::Matrix< T, Eigen::Dynamic, 1 > &v_)
 
void repeatVector(Eigen::Matrix< T, Eigen::Dynamic, 1 > &in)
 
friend class boost::serialization::access
 
Template class representing an nD (n-Dimensional) tensor. Tensor is row-major, i.e. first dimension is height (rows), second is width (cols), third is depth (channels) etc. 
 
void elementwiseFunction(T(*func)(T))
 
Template-typed Matrix of dynamic size. Uses OpenBLAS if found by CMAKE - overloaded, specializations of * operator for types: float, double. 
 
std::vector< size_t > dims()