PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
Eigen_Utilities.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __EIGEN_UTILITIES_H
13#define __EIGEN_UTILITIES_H
14
15#include <iostream>
16#include <string>
17
18#include "Eigen/Eigen"
19#include "IOUtilities.hpp"
20
21namespace Gedim
22{
23std::ostream &operator<<(std::ostream &out, const Eigen::VectorXd &vec);
24std::ostream &operator<<(std::ostream &out, const Eigen::Map<const Eigen::VectorXd> &vec);
25std::ostream &operator<<(std::ostream &out, const Eigen::MatrixXd &mat);
26
28{
29 private:
30 public:
31 template <typename Derived>
32 static Eigen::Map<const Eigen::SparseMatrix<Derived>> SparseMatrixToMap(const unsigned int &rows,
33 const unsigned int &cols,
34 const unsigned int &nnz,
35 const int *innerVectors,
36 const int *innerIndeces,
37 const Derived *values)
38 {
39 return Eigen::Map<const Eigen::SparseMatrix<Derived>>(rows, cols, nnz, innerVectors, innerIndeces, values);
40 }
41
42 template <typename Derived>
43 static Eigen::Map<const Eigen::SparseMatrix<Derived>> SparseMatrixToMap(const Eigen::Ref<const Eigen::SparseMatrix<Derived>> sparseMatrix)
44 {
45 return SparseMatrixToMap(sparseMatrix.rows(),
46 sparseMatrix.cols(),
47 sparseMatrix.nonZeros(),
48 sparseMatrix.outerIndexPtr(),
49 sparseMatrix.innerIndexPtr(),
50 sparseMatrix.valuePtr());
51 }
52
53 template <typename Derived, int Rows, int Cols>
54 static Eigen::Map<const Eigen::Array<Derived, Rows, Cols>> ArrayToMap(const int &rows, const int &cols, const Derived *values)
55 {
56 return Eigen::Map<const Eigen::Array<Derived, Rows, Cols>>(values, rows, cols);
57 }
58
62 template <typename Derived, int Rows, int Cols>
63 static Eigen::Map<const Eigen::Array<Derived, Rows, Cols>> ArrayToMap(const Eigen::Array<Derived, Rows, Cols> &matrix)
64 {
65 return ArrayToMap(matrix.rows(), matrix.cols(), matrix.data());
66 }
67
68 template <typename Derived, int Rows, int Cols = 1, int Options>
69 static Eigen::Map<const Eigen::Matrix<Derived, Rows, Cols, Options>> MatrixToMap(const int &rows, const int &cols, const Derived *values)
70 {
71 return Eigen::Map<const Eigen::Matrix<Derived, Rows, Cols, Options>>(values, rows, cols);
72 }
73
77 template <typename Derived, int Rows, int Cols, int Options>
78 static Eigen::Map<const Eigen::Matrix<Derived, Rows, Cols, Options>> MatrixToMap(const Eigen::Matrix<Derived, Rows, Cols, Options> &matrix)
79 {
80 return MatrixToMap(matrix.rows(), matrix.cols(), matrix.data());
81 }
82
86 template <typename Derived, int Rows, int Cols>
87 static std::vector<Eigen::Map<const Eigen::Matrix<Derived, Rows, Cols>>> MatrixToMap(
88 const std::vector<Eigen::Matrix<Derived, Rows, Cols>> &matrices)
89 {
90 std::vector<Eigen::Map<const Eigen::Matrix<Derived, Rows, Cols>>> maps;
91 maps.reserve(matrices.size());
92
93 for (const Eigen::Matrix<Derived, Rows, Cols> &matrix : matrices)
94 maps.push_back(MatrixToMap(matrix));
95 }
96
97 template <typename Derived>
98 static std::vector<Eigen::Triplet<Derived>> SparseMatrixToTriplets(const Eigen::SparseMatrix<Derived> &sparseMatrix)
99 {
100 std::vector<Eigen::Triplet<Derived>> triplets;
101 for (int i = 0; i < sparseMatrix.outerSize(); i++)
102 for (typename Eigen::SparseMatrix<Derived>::InnerIterator it(sparseMatrix, i); it; ++it)
103 triplets.emplace_back(it.row(), it.col(), it.value());
104 return triplets;
105 }
106
107 static void ReadFromBinaryFile(const std::string &nameFile,
108 Eigen::VectorXd &dataToRead,
109 const unsigned int &dataSizeToRead = 0,
110 const unsigned int &startingPosition = 0);
111 static void WriteToBinaryFile(const std::string &nameFile,
112 const Eigen::VectorXd &vec,
113 const unsigned int &dataSizeToWrite = 0,
114 const unsigned int &dataStartingPositionToWrite = 0,
115 const bool &append = false);
116 static void ReadFromBinaryFile(const std::string &nameFile,
117 Eigen::Map<Eigen::VectorXd> &dataToRead,
118 const unsigned int &dataSizeToRead = 0,
119 const unsigned int &startingPosition = 0);
120 static void WriteToBinaryFile(const std::string &nameFile,
121 const Eigen::Map<const Eigen::VectorXd> &vec,
122 const unsigned int &dataSizeToWrite = 0,
123 const unsigned int &dataStartingPositionToWrite = 0,
124 const bool &append = false);
125 static void ReadFromBinaryFile(const std::string &nameFile,
126 unsigned int &rows,
127 unsigned int &cols,
128 std::vector<Eigen::Triplet<double>> &triplets,
129 const unsigned int &startingPosition = 0);
130 static void ReadFromBinaryFile(const std::string &nameFile,
131 Eigen::SparseMatrix<double, Eigen::RowMajor> &matrix,
132 const unsigned int &startingPosition = 0);
133 static void ReadFromBinaryFile(const std::string &nameFile,
134 Eigen::SparseMatrix<double, Eigen::ColMajor> &matrix,
135 const unsigned int &startingPosition = 0);
136 static void WriteToBinaryFile(const std::string &nameFile,
137 const Eigen::SparseMatrix<double, Eigen::RowMajor> &matrix,
138 const Eigen::UpLoType &matrixType = (Eigen::UpLoType)0,
139 const bool &append = false);
140 static void WriteToBinaryFile(const std::string &nameFile,
141 const Eigen::SparseMatrix<double, Eigen::ColMajor> &matrix,
142 const Eigen::UpLoType &matrixType = (Eigen::UpLoType)0,
143 const bool &append = false);
144
145 static void RemoveRow(Eigen::MatrixXd &matrix, const unsigned int &rowToRemove);
146 static void RemoveColumn(Eigen::MatrixXd &matrix, const unsigned int &colToRemove);
147
148 template <typename collection_type> static Eigen::MatrixXd CoordinatesToMatrix(const collection_type &coordinates)
149 {
150 Eigen::MatrixXd matrix(3, coordinates.size());
151
152 unsigned int c = 0;
153 for (const auto &coordinate : coordinates)
154 matrix.col(c++) << coordinate;
155
156 return matrix;
157 }
158};
159} // namespace Gedim
160#endif // __EIGEN_UTILITIES_H
Eigen column vector.
Definition Eigen_Array.hpp:23
Definition Eigen_Utilities.hpp:28
static Eigen::MatrixXd CoordinatesToMatrix(const collection_type &coordinates)
Definition Eigen_Utilities.hpp:148
static void ReadFromBinaryFile(const std::string &nameFile, Eigen::SparseMatrix< double, Eigen::RowMajor > &matrix, const unsigned int &startingPosition=0)
static Eigen::Map< const Eigen::SparseMatrix< Derived > > SparseMatrixToMap(const Eigen::Ref< const Eigen::SparseMatrix< Derived > > sparseMatrix)
Definition Eigen_Utilities.hpp:43
static Eigen::Map< const Eigen::Matrix< Derived, Rows, Cols, Options > > MatrixToMap(const Eigen::Matrix< Derived, Rows, Cols, Options > &matrix)
Convert a matrix expressions to map.
Definition Eigen_Utilities.hpp:78
static void ReadFromBinaryFile(const std::string &nameFile, Eigen::Map< Eigen::VectorXd > &dataToRead, const unsigned int &dataSizeToRead=0, const unsigned int &startingPosition=0)
static void WriteToBinaryFile(const std::string &nameFile, const Eigen::Map< const Eigen::VectorXd > &vec, const unsigned int &dataSizeToWrite=0, const unsigned int &dataStartingPositionToWrite=0, const bool &append=false)
static void WriteToBinaryFile(const std::string &nameFile, const Eigen::SparseMatrix< double, Eigen::RowMajor > &matrix, const Eigen::UpLoType &matrixType=(Eigen::UpLoType) 0, const bool &append=false)
static Eigen::Map< const Eigen::Array< Derived, Rows, Cols > > ArrayToMap(const int &rows, const int &cols, const Derived *values)
Definition Eigen_Utilities.hpp:54
static void ReadFromBinaryFile(const std::string &nameFile, Eigen::SparseMatrix< double, Eigen::ColMajor > &matrix, const unsigned int &startingPosition=0)
static std::vector< Eigen::Map< const Eigen::Matrix< Derived, Rows, Cols > > > MatrixToMap(const std::vector< Eigen::Matrix< Derived, Rows, Cols > > &matrices)
Convert a std::vector of const Eigen::Matrix expressions to const map.
Definition Eigen_Utilities.hpp:87
static void RemoveRow(Eigen::MatrixXd &matrix, const unsigned int &rowToRemove)
Definition Eigen_Utilities.cpp:61
static void WriteToBinaryFile(const std::string &nameFile, const Eigen::SparseMatrix< double, Eigen::ColMajor > &matrix, const Eigen::UpLoType &matrixType=(Eigen::UpLoType) 0, const bool &append=false)
static void WriteToBinaryFile(const std::string &nameFile, const Eigen::VectorXd &vec, const unsigned int &dataSizeToWrite=0, const unsigned int &dataStartingPositionToWrite=0, const bool &append=false)
static void ReadFromBinaryFile(const std::string &nameFile, Eigen::VectorXd &dataToRead, const unsigned int &dataSizeToRead=0, const unsigned int &startingPosition=0)
static void ReadFromBinaryFile(const std::string &nameFile, unsigned int &rows, unsigned int &cols, std::vector< Eigen::Triplet< double > > &triplets, const unsigned int &startingPosition=0)
static void RemoveColumn(Eigen::MatrixXd &matrix, const unsigned int &colToRemove)
Definition Eigen_Utilities.cpp:72
static Eigen::Map< const Eigen::Array< Derived, Rows, Cols > > ArrayToMap(const Eigen::Array< Derived, Rows, Cols > &matrix)
Convert a matrix expressions to map.
Definition Eigen_Utilities.hpp:63
static Eigen::Map< const Eigen::SparseMatrix< Derived > > SparseMatrixToMap(const unsigned int &rows, const unsigned int &cols, const unsigned int &nnz, const int *innerVectors, const int *innerIndeces, const Derived *values)
Definition Eigen_Utilities.hpp:32
static Eigen::Map< const Eigen::Matrix< Derived, Rows, Cols, Options > > MatrixToMap(const int &rows, const int &cols, const Derived *values)
Definition Eigen_Utilities.hpp:69
static std::vector< Eigen::Triplet< Derived > > SparseMatrixToTriplets(const Eigen::SparseMatrix< Derived > &sparseMatrix)
Definition Eigen_Utilities.hpp:98
Definition Eigen_Array.cpp:22
std::ostream & operator<<(std::ostream &out, const Eigen::VectorXd &vec)
Definition Eigen_Utilities.cpp:21