37#ifndef EigenFunctions_H
38#define EigenFunctions_H
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wold-style-cast"
43#include <unsupported/Eigen/SparseExtra>
44#include <unsupported/Eigen/CXX11/Tensor>
45#pragma GCC diagnostic pop
70Eigen::SparseMatrix<T>
vectorize(Eigen::SparseMatrix<T>& Matrix);
84T
max(Eigen::SparseMatrix<T>& mat, label& ind_row, label& ind_col);
98T
min(Eigen::SparseMatrix<T>& mat, label& ind_row, label& ind_col);
107 Eigen::MatrixXd& eigenvectors);
122Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
innerProduct(
123 List <Eigen::SparseMatrix<T >>& A, List <Eigen::SparseMatrix<T >>& B);
138Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
innerProduct(
139 List <Eigen::SparseMatrix<T >>& A, Eigen::SparseMatrix<T>& B);
155T
innerProduct(Eigen::SparseMatrix<T>& A, Eigen::SparseMatrix<T>& B);
172Eigen::SparseMatrix<T>
MVproduct(List<Eigen::SparseMatrix<T >>& A,
173 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C);
190Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
MVproduct(
191 const std::vector< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& A,
192 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C);
209List<Eigen::SparseMatrix<T >>
MMproduct(List<Eigen::SparseMatrix<T >>& A,
210 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C);
222T
condNumber(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& A);
235Eigen::VectorXd
ExpSpaced(
double first,
double last,
int n);
248 const Eigen::Matrix<T, Eigen::Dynamic, 1>& g,
249 const Eigen::Tensor<T, 3 >& c,
250 const Eigen::Matrix<T, Eigen::Dynamic, 1>& a);
281 typedef Eigen::Triplet<double> Trip;
282 std::vector<Trip> tripletList;
283 tripletList.reserve(Matrix.nonZeros());
284 Eigen::SparseMatrix<T> vec;
285 vec.resize(1, Matrix.size());
286 vec.reserve(Matrix.nonZeros());
288 for (label k = 0; k < Matrix.outerSize(); ++k)
290 for (Eigen::SparseMatrix<double>::InnerIterator it(Matrix, k); it; ++it)
292 tripletList.push_back(Trip(0, it.row() + it.col() * Matrix.rows(), it.value()));
296 vec.setFromTriplets(tripletList.begin(), tripletList.end());
306 for (label k = 0; k < mat.outerSize(); ++k)
308 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
310 if (
max < it.value() || i == 0)
330 for (label k = 0; k < mat.outerSize(); ++k)
332 for (
typename Eigen::SparseMatrix<T>::InnerIterator it(mat, k); it; ++it)
334 if (
min > it.value() || i == 0)
349 List <Eigen::SparseMatrix<T >>& A, List <Eigen::SparseMatrix<T >>& B)
351 label rows = A.size();
352 label cols = B.size();
353 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
354 out.resize(rows, cols);
356 for (label i = 0; i < rows; i++)
358 for (label j = 0; j < cols; j++)
369 List<Eigen::SparseMatrix<T >>& A, Eigen::SparseMatrix<T>& B)
371 label rows = A.size();
373 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
374 out.resize(rows, cols);
376 for (label i = 0; i < rows; i++)
386 Eigen::SparseMatrix<T>& B)
390 for (label k = 0; k < A.cols(); k++)
392 res += A.col(k).dot(B.col(k));
401 , Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C)
403 Eigen::SparseMatrix<T> out;
406 for (label i = 1; i < A.size(); i++)
416 const std::vector< Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& A,
417 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C)
419 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> out;
422 for (label i = 1; i < A.size(); i++)
434 List<Eigen::SparseMatrix<T >>& A,
435 Eigen::DenseBase<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >>& C)
437 List<Eigen::SparseMatrix<T >> out;
438 out.resize(C.cols());
439 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> col;
441 for (label i = 0; i < C.cols(); i++)
454 Eigen::JacobiSVD<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic >> svd(A);
455 T cond = svd.singularValues()(0) / svd.singularValues()(
456 svd.singularValues().size() - 1);
463using namespace Eigen;
465template<
typename VectorType>
466bool saveMarketVector (
const VectorType & vec,
const std::string & filename,
467 label prec, std::_Ios_Fmtflags outytpe = std::ios_base::scientific)
469 typedef typename VectorType::Scalar Scalar;
470 std::ofstream out(filename.c_str(), std::ios::out);
480 if (internal::is_same<Scalar, std::complex<float >>::value
481 || internal::is_same<Scalar, std::complex<double >>::value)
483 out <<
"%%MatrixMarket matrix array complex general\n";
487 out <<
"%%MatrixMarket matrix array real general\n";
490 out << vec.size() <<
" " << 1 <<
"\n";
492 for (label i = 0; i < vec.size(); i++)
494 internal::putDenseElt(vec(i), out);
501template<
typename VectorType>
502Matrix<VectorType, Dynamic, Dynamic> SliceFromTensor(
503 Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
505 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
506 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
513 t2.dimensions()[1] );
517template<
typename VectorType>
518Matrix<VectorType, Dynamic, Dynamic> SliceFromTensor(
519 const Eigen::Tensor<VectorType, 3>& tensor, label dim, label index1)
521 Eigen::Tensor<VectorType, 2> t2 = tensor.chip(index1, dim);
522 Matrix<VectorType, Dynamic, Dynamic> m = Eigen::Map<Eigen::Matrix<
529 t2.dimensions()[1] );
Namespace to perform operation on Eigen objects.
Eigen::VectorXd repeatElements(Eigen::VectorXd input, int n)
Repeat each element n times after themselves.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > vectorTensorProduct(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &g, const Eigen::Tensor< T, 3 > &c, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &a)
A function that computes the product of g.T c a, where c is a third dim tensor.
Eigen::SparseMatrix< T > MVproduct(List< Eigen::SparseMatrix< T > > &A, Eigen::DenseBase< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > > &C)
Sparse Matrix-Vector product between a list of sparse matrices and a vector of coefficients.
Eigen::VectorXd reorderVectorFromDim(Eigen::VectorXd input, int dim)
Changes the order of the vector's elements given a dimension.
T max(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the maximum of a sparse Matrix (Useful for DEIM).
Eigen::VectorXd ExpSpaced(double first, double last, int n)
Returns exponentially spaced vector.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > innerProduct(List< Eigen::SparseMatrix< T > > &A, List< Eigen::SparseMatrix< T > > &B)
Perform Frobenius inner Product between two list of sparse matrices A and B.
Eigen::SparseMatrix< T > vectorize(Eigen::SparseMatrix< T > &Matrix)
Vectorize a Sparse Matrix.
void sortEigenvalues(Eigen::VectorXd &eigenvalues, Eigen::MatrixXd &eigenvectors)
sort eigenvalues
T condNumber(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &A)
Conditioning number of a dense matrix.
List< Eigen::SparseMatrix< T > > MMproduct(List< Eigen::SparseMatrix< T > > &A, Eigen::DenseBase< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > > &C)
Sparse Matrix - Dense Matrix product between a list of sparse matrices and a dense matrix.
T min(Eigen::SparseMatrix< T > &mat, label &ind_row, label &ind_col)
Find the minimum of a sparse Matrix (Useful for DEIM).