* matrix.h - matrix class definitions
*
* Copyright (C) 2003-2009 Stefan Jahn <stefan@lkcc.org>
* Copyright (C) 2012-2017 Qucs Team
*
* This 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 2, or (at your option)
* any later version.
*
* This software 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 this package; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* $Id$
*
*/
\brief Dense matrix class header file
*/
#ifndef __MATRIX_H__
#define __MATRIX_H__
namespace qucs {
class vector;
class matrix;
matrix eye (int);
matrix transpose (matrix);
matrix conj (matrix);
matrix abs (matrix);
matrix dB (matrix);
matrix arg (matrix);
matrix adjoint (matrix);
matrix real (matrix);
matrix imag (matrix);
matrix sqr (matrix);
matrix eye (int, int);
matrix diagonal (vector);
matrix pow (matrix, int);
nr_complex_t cofactor (matrix, int, int);
nr_complex_t detLaplace (matrix);
nr_complex_t detGauss (matrix);
nr_complex_t det (matrix);
matrix inverseLaplace (matrix);
matrix inverseGaussJordan (matrix);
matrix inverse (matrix);
matrix stos (matrix, nr_complex_t, nr_complex_t z0 = 50.0);
matrix stos (matrix, nr_double_t, nr_double_t z0 = 50.0);
matrix stos (matrix, vector, nr_complex_t z0 = 50.0);
matrix stos (matrix, nr_complex_t, vector);
matrix stos (matrix, vector, vector);
matrix stoz (matrix, nr_complex_t z0 = 50.0);
matrix stoz (matrix, vector);
matrix ztos (matrix, nr_complex_t z0 = 50.0);
matrix ztos (matrix, vector);
matrix ztoy (matrix);
matrix stoy (matrix, nr_complex_t z0 = 50.0);
matrix stoy (matrix, vector);
matrix ytos (matrix, nr_complex_t z0 = 50.0);
matrix ytos (matrix, vector);
matrix ytoz (matrix);
matrix stoa (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix atos (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix stoh (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix htos (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix stog (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix gtos (matrix, nr_complex_t z1 = 50.0, nr_complex_t z2 = 50.0);
matrix cytocs (matrix, matrix);
matrix cztocs (matrix, matrix);
matrix cztocy (matrix, matrix);
matrix cstocy (matrix, matrix);
matrix cytocz (matrix, matrix);
matrix cstocz (matrix, matrix);
matrix twoport (matrix, char, char);
nr_double_t rollet (matrix);
nr_double_t b1 (matrix);
matrix rad2deg (matrix);
matrix deg2rad (matrix);
* \brief Dense complex matrix class
* This class defines a matrix object with its methods, operators and operations.
*/
class matrix
{
public:
matrix ();
matrix (int);
matrix (int, int);
matrix (const matrix &);
const matrix& operator = (const matrix &);
~matrix ();
nr_complex_t get (int, int);
void set (int, int, nr_complex_t);
int getCols (void) { return cols; }
int getRows (void) { return rows; }
nr_complex_t * getData (void) { return data; }
void print (void);
void exchangeRows (int, int);
void exchangeCols (int, int);
friend matrix operator + (matrix, matrix);
friend matrix operator + (nr_complex_t, matrix);
friend matrix operator + (matrix, nr_complex_t);
friend matrix operator + (nr_double_t, matrix);
friend matrix operator + (matrix, nr_double_t);
friend matrix operator - (matrix, matrix);
friend matrix operator - (nr_complex_t, matrix);
friend matrix operator - (matrix, nr_complex_t);
friend matrix operator - (nr_double_t, matrix);
friend matrix operator - (matrix, nr_double_t);
friend matrix operator / (matrix, nr_complex_t);
friend matrix operator / (matrix, nr_double_t);
friend matrix operator * (nr_complex_t, matrix);
friend matrix operator * (matrix, nr_complex_t);
friend matrix operator * (nr_double_t, matrix);
friend matrix operator * (matrix, nr_double_t);
friend matrix operator * (matrix, matrix);
matrix operator - ();
matrix operator += (matrix);
matrix operator -= (matrix);
matrix getBlock(int, int, int, int);
matrix getTopLeftCorner(int, int);
matrix getBottomLeftCorner(int, int);
matrix getTopRightCorner(int, int);
matrix getBottomRightCorner(int, int);
void setBlock(matrix, int, int, int, int);
void setTopLeftCorner(matrix, int, int);
void setBottomLeftCorner(matrix, int, int);
void setTopRightCorner(matrix, int, int);
void setBottomRightCorner(matrix, int, int);
friend matrix transpose (matrix);
friend matrix conj (matrix);
friend matrix abs (matrix);
friend matrix dB (matrix);
friend matrix arg (matrix);
friend matrix adjoint (matrix);
friend matrix real (matrix);
friend matrix imag (matrix);
friend matrix sqr (matrix);
friend matrix eye (int, int);
friend matrix diagonal (qucs::vector);
friend matrix pow (matrix, int);
friend nr_complex_t cofactor (matrix, int, int);
friend nr_complex_t detLaplace (matrix);
friend nr_complex_t detGauss (matrix);
friend nr_complex_t det (matrix);
friend matrix inverseLaplace (matrix);
friend matrix inverseGaussJordan (matrix);
friend matrix inverse (matrix);
friend matrix stos (matrix, nr_complex_t, nr_complex_t);
friend matrix stos (matrix, nr_double_t, nr_double_t);
friend matrix stos (matrix, qucs::vector, nr_complex_t);
friend matrix stos (matrix, nr_complex_t, qucs::vector);
friend matrix stos (matrix, qucs::vector, qucs::vector);
friend matrix stoz (matrix, nr_complex_t);
friend matrix stoz (matrix, qucs::vector);
friend matrix ztos (matrix, nr_complex_t);
friend matrix ztos (matrix, qucs::vector);
friend matrix ztoy (matrix);
friend matrix stoy (matrix, nr_complex_t);
friend matrix stoy (matrix, qucs::vector);
friend matrix ytos (matrix, nr_complex_t);
friend matrix ytos (matrix, qucs::vector);
friend matrix ytoz (matrix);
friend matrix stoa (matrix, nr_complex_t, nr_complex_t);
friend matrix atos (matrix, nr_complex_t, nr_complex_t);
friend matrix stoh (matrix, nr_complex_t, nr_complex_t);
friend matrix htos (matrix, nr_complex_t, nr_complex_t);
friend matrix stog (matrix, nr_complex_t, nr_complex_t);
friend matrix gtos (matrix, nr_complex_t, nr_complex_t);
friend matrix cytocs (matrix, matrix);
friend matrix cztocs (matrix, matrix);
friend matrix cztocy (matrix, matrix);
friend matrix cstocy (matrix, matrix);
friend matrix cytocz (matrix, matrix);
friend matrix cstocz (matrix, matrix);
friend matrix twoport (matrix, char, char);
friend nr_double_t rollet (matrix);
friend nr_double_t b1 (matrix);
friend matrix rad2deg (matrix);
friend matrix deg2rad (matrix);
\param[in] r: row number (from 0 like usually in C)
\param[in] c: column number (from 0 like usually in C)
\return Cell in the row r and column c
\todo: Why not inline
\todo: Why not r and c not const
\todo: Create a debug version checking out of bound (using directly assert)
*/
nr_complex_t operator () (int r, int c) const { return data[r * cols + c]; }
\param[in] r: row number (from 0 like usually in C)
\param[in] c: column number (from 0 like usually in C)
\return Reference to cell in the row r and column c
\todo: Why not inline
\todo: Why r and c not const
\todo: Create a debug version checking out of bound (using directly assert)
*/
nr_complex_t& operator () (int r, int c) { return data[r * cols + c]; }
private:
int cols;
int rows;
nr_complex_t * data;
};
}
#endif