/** * \file Mmn.h * * \brief Matrizenmanipulation beliebiger Matrizen * * Stellt eine Klasse zur verfügung, mit der sich alle denkbaren * algebraischen Manipulationen an Matrizen beliebiger größe * ausführen lassen, incl. lösen eines Gleichungssystems dessen * erweiterte Koeffizientenmatrix diese Matrix ist. * * \author Georg Steffers [GS] * * \date 06.12.2003 * * \version ..2002 erste funktionierende Version [GS] * \version 06.12.2003 beginn der Dokumentation via doxygen [GS] */ /* * Copyright (C)2003 Georg Steffers * * This program 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 of the License, or * (at your option) any later version. * * This program 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 program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __MMN_H__ #define __MMN_H__ using namespace std; #include #include #include "sin_cos.h" typedef enum gauss_typ {TREPPENNORMALE, INVERSE}; //!< \brief Was soll mit dem //! Gauss-Algorithmus //! ermittelt werden? template class Mmn; //! Skalarmultiplikation Skalar * Matrize template Mmn operator*(const K&, const Mmn&); /** * \brief Darstellung einer Matrize und der auf ihr möglichen * algebraischen Operationen * * Diese Klasse stellt meinen Lernerfolg in Lineare Algebra I dar. */ template class Mmn { protected: K** _a; //!< \brief Die Matrize als doppelter Pointer auf //! den skalaren Typ K unsigned m, n; //!< Zeilen, Spalten der Matrize unsigned Rg; //!< \brief Der Rang der Matrize //! //! wird nur gefüllt wenn die Matrize über //! Gauss in Treppennormalform gebracht wurde. bool Det_F; //!< enthält Det einen gültigen Wert? K Det; //!< \brief Die Determinante der Matrize //! //! Sobald sie errechnet wurde wird sie hier //! gespeichert, bis die Matrize verändert //! wird, damit sie nicht immer wieder neu berechnet //! werden muß void freeall(void); //!< die matrize wieder freigeben K sarrus(void) const; //!< \brief Sarrusregel //! //! zum ermitteln //! der Determinante einer 3x3 Matrize K laplace(void) const; //!< \brief Laplace'scher Entwicklungssatz //! //! zum ermitteln der Determinante bei //! größeren Matrizen als 3x3 public: // Konstruktoren //! Defaultkontruktor Mmn() : _a(NULL), m(0), n(0), Rg(0), Det_F(false) {} Mmn(unsigned); //!< EinheitsMatrix Mmn(unsigned, unsigned); //!< NullMatrix Mmn(K*, unsigned, unsigned); //!< \brief Konstruktor für eine //! beliebige Matrix Mmn(const Mmn&); //!< Copykonstruktor virtual ~Mmn(); //!< Destruktor //! Zuweisungsoperator const Mmn& operator=(const Mmn&); //! Skalarmultiplikation (Matrix * Skalar) Mmn operator*(const K&) const; //! Als friend damit auch Parameter 1 ein Skalar sein kann friend Mmn operator*<>(const K&, const Mmn&); // Hier können eh nur Matrizen verwendet werden. Daher sind // keine weiteren friends nötig Mmn operator%(const Mmn&) const; //!< Matrizenprodukt Mmn operator+(const Mmn&) const; //!< Matrizensumme Mmn operator-(void) const; //!< Negation Mmn operator-(const Mmn&) const; //!< Subtraktion //! eine NullMatrix derselben Groesse Mmn null(void) const { return Mmn(m,n); } bool is_null(void) const { for(unsigned i=0; i In(void) const { return Mmn(n); } //! Einheitsmatrizen zu Anzahl Zeilen Mmn Im(void) const { return Mmn(m); } //! Ein Element aij der Matrize K& a(unsigned i, unsigned j) { Det_F=false; return _a[i][j]; } const K& a(unsigned i, unsigned j) const { return _a[i][j]; } //! Determinante K det(void); K det(void) const; //! Transponierte Mmn T(void) const; // Zeile und/oder Spalte aus matrize enftfernen //! Zeile aus matrize enftfernen Mmn Ai(unsigned) const; //! Spalte aus matrize enftfernen Mmn Aj(unsigned) const; //! Zeile und Spalte aus matrize enftfernen Mmn Aij(unsigned, unsigned) const; // Adjunkten ermitteln (2 verschiedene Verfahren) Mmn Ad_det(void) const; //!< Adjunkte ueber Determinanten entwickelt Mmn Ad_inv(void) const; //!< Inverse=>Adjunkte / gauss=>Adj.-Satz // Inverse ermitteln (2 verschiedene Verfahren) Mmn gauss(gauss_typ) const; //!< \brief inverse Matrix ueber //! Gauss-Algorithmus Mmn inv_Ad(void) const; //!< \brief Adjunkte=>Inverse / //! Ad_det=>Adj.-Satz // lineare Gleichungssysteme Mmn solve(void) const; //!< Gleichungssystem loesen Mmn special_solve(void) const; //!< \brief eine Spezielle Loesung des //! mit an=1, damit alle xi!=0 // formatierte Ausgabe void print(ostream& = cout) const; //!< Daten der Matrize ausgeben }; template Mmn operator*(const K& a, const Mmn& A) { return A * a; } template inline ostream& operator<<(ostream& strm, const Mmn& A) { A.print(strm); return strm; } template inline void Mmn::print(ostream& strm) const { strm << "lines: " << m << "\n"; strm << "cols: " << n << "\n"; for(unsigned i=0; i