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()