/* * Copyright © 2004-2011 Ondra Kamenik * Copyright © 2019 Dynare Team * * This file is part of Dynare. * * Dynare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dynare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dynare. If not, see . */ #ifndef SYLV_MATRIX_H #define SYLV_MATRIX_H #include "GeneralMatrix.hh" #include "KronVector.hh" #include class SqSylvMatrix; class SylvMatrix : public GeneralMatrix { public: SylvMatrix(int m, int n) : GeneralMatrix(m, n) { } SylvMatrix(Vector d, int m, int n) : GeneralMatrix(std::move(d), m, n) { } SylvMatrix(const GeneralMatrix& m) : GeneralMatrix(m) { } SylvMatrix(const GeneralMatrix& m, int i, int j, int nrows, int ncols) : GeneralMatrix(m, i, j, nrows, ncols) { } SylvMatrix(GeneralMatrix& m, int i, int j, int nrows, int ncols) : GeneralMatrix(m, i, j, nrows, ncols) { } SylvMatrix(const SylvMatrix& m) = default; SylvMatrix(SylvMatrix&& m) = default; SylvMatrix& operator=(const SylvMatrix& m) = default; SylvMatrix& operator=(SylvMatrix&& m) = default; /* ⎛I 0⎞ this = ⎝0 m⎠·this */ void multLeftI(const SqSylvMatrix& m); /* ⎛I 0⎞ this = ⎝0 mᵀ⎠·this */ void multLeftITrans(const SqSylvMatrix& m); // this = (0 a)·b, so that (0 a) is square void multLeft(int zero_cols, const GeneralMatrix& a, const GeneralMatrix& b); // this = this·(m⊗m⊗…⊗m) void multRightKron(const SqSylvMatrix& m, int order); // this = this·(mᵀ⊗mᵀ⊗…⊗mᵀ) void multRightKronTrans(const SqSylvMatrix& m, int order); /* this = P·this, x = P·x, where P is gauss transformation setting a given element to zero */ void eliminateLeft(int row, int col, Vector& x); /* this = this·P, x = Pᵀ·x, where P is gauss transformation setting a given element to zero */ void eliminateRight(int row, int col, Vector& x); }; class SqSylvMatrix : public SylvMatrix { public: SqSylvMatrix(int m) : SylvMatrix(m, m) { } SqSylvMatrix(Vector d, int m) : SylvMatrix(std::move(d), m, m) { } SqSylvMatrix(const SylvMatrix& m) : SylvMatrix(m) { } SqSylvMatrix(const SqSylvMatrix& m) = default; SqSylvMatrix(SqSylvMatrix&& m) = default; SqSylvMatrix(const GeneralMatrix& m, int i, int j, int nrows) : SylvMatrix(m, i, j, nrows, nrows) { } SqSylvMatrix(GeneralMatrix& m, int i, int j, int nrows) : SylvMatrix(m, i, j, nrows, nrows) { } SqSylvMatrix& operator=(const SqSylvMatrix& m) = default; SqSylvMatrix& operator=(SqSylvMatrix&& m) = default; // x = (this⊗this⊗…⊗this)·d void multVecKron(KronVector& x, const ConstKronVector& d) const; // x = (thisᵀ⊗thisᵀ⊗…⊗thisᵀ)·d void multVecKronTrans(KronVector& x, const ConstKronVector& d) const; // a = this⁻¹·a, b=this⁻¹·b */ void multInvLeft2(GeneralMatrix& a, GeneralMatrix& b, double& rcond1, double& rcondinf) const; // this = I void setUnit(); }; #endif /* SYLV_MATRIX_H */