Matrizen
-
Wie kann ich am einfachsten Matrizen speichern (in C++)?
Anfoderungen:
- beliebige Matrix speichern (m x n)
- Matrix element kann ebenfalls beliebig seinGibt's irgendwo eine Klasse im Inet die das kann?
Oder kann das eine Lib (Boost?)?Oder muss ich selber eine Klasse dafür schreiben? Falls so, wie mache ich das?
Danke und Gruss
-
Hier mal auszüge meiner Version:
#ifndef MATRIX_H #define MATRIX_H template <class T> class Matrix; #include <vector> #include <fstream> #include <iostream> #include <string> #include "Myerror.h" #include "Vector.h" using namespace std; template <class T> class Matrix { public: typedef T value_type; private: size_type _rows; size_type _cols; T* _data; void resize(size_type i, size_type j) {_rows=i; _cols=j;} T* data () { return (_data); } public: // constructors/destructors Matrix() : _rows (0), _cols (0), _data (0) {} Matrix(size_type& i, size_type& j) : _rows (i), _cols (j), _data (new T [size()]) {initialize((T)(0));} Matrix(int i, int j) : _rows (size_type(i)), _cols (size_type(j)), _data (new T [size()]) {} Matrix (size_type N, size_type M, const T& t=T()) : _rows (N), _cols (M), _data (new T [size()]) { initialize(t); } Matrix (const Matrix& X) : _rows (X.Rows()), _cols (X.Cols()), _data (new T [size()]) { for (int i = 0; i < Rows(); ++i) {for (int j = 0; j < Cols(); ++j) {operator()(i,j) = X(i,j);} } } ~Matrix () { delete [] _data; } // initialize Elements void initialize(const T& t) { for (int i = 0; i < Rows(); ++i) {for (int j = 0; j < Cols(); ++j) {operator()(i,j) = t;} } } // Matrix-dimensions inline size_type Rows() const { return _rows; } inline size_type Cols() const { return _cols; } inline size_type size() const { return _rows * _cols; } // Access to elements const T& operator() (const size_type& i, const size_type& j) const { return _data [i*_cols + j]; } T& operator() (const size_type& i, const size_type& j) { return _data [i*_cols + j]; } // Zugriff auf Zeilen,Spalten,Diagonale ... // Matrix-Matrix Operatoren Matrix<T> operator+(const Matrix& m) { if ((Rows()!=m.Rows())||(Cols()!=m.Cols())) {throw DimensionClash();} Matrix<T> res(m.Rows(),m.Cols()); for (int i=0;i<m.Rows();i++) { for (int j=0;j<m.Cols();j++) { res(i,j)=(operator()(i,j))+m(i,j); } } return res; } ... // I/O - Operatoren/Methoden ostream& StoreASCII(ostream& ost) const { ost << _rows << 'x' << _cols << endl; for (int i = 0; i < Rows(); ++i) {for (int j = 0; j < Cols(); ++j) {ost << operator()(i,j) << ' ';} ost << endl; } return ost; } ... // Iteratoren iterator begin () { return _data; } ... }; // end of class Matrix<T>
Viel Spaß!
-
Ist dein Code komplett? Oder fehlt da noch Code?
Gibt es eine Art "Standard" Matrix Implementation, die sich durchgesetzt hat?
-
Fehlt einiges. Soll nur das Prinzip verdeutlichen.
#include "Myerror.h"
#include "Vector.h"Die beiden Dateien hast du zum Beispiel nicht (sind nämlich von mir). Damit gibt es auch die DimensionClash-Exception nicht.
Gruß LIBS
-
Es gibt doch bereits zahlreiche fertige und von guten Entwicklern entworfene Librarys dazu. Warum nimmst du nicht einfach die
http://www.oonumerics.org/blitz/
http://www.boost.org/libs/numeric/ublas/doc/index.htm