MatrixN.h

00001 /****************************************************************************
00002  * Copyright 2005 Evan Drumwright
00003  * This library is distributed under the terms of the GNU General Public 
00004  * License (found in COPYING).
00005  ****************************************************************************/
00006 
00007 #ifndef _MATRIXN_H
00008 #define _MATRIXN_H
00009 
00010 #include <Physsim/VectorN.h>
00011 
00012 namespace Physsim {
00013                                 
00015 
00018 class MatrixN
00019 {
00020         public:
00021                 MatrixN();
00022                 MatrixN(unsigned rows, unsigned columns);
00023                 MatrixN(const MatrixN& source);
00024                 MatrixN(unsigned rows, unsigned columns, const boost::shared_array<Real> array);
00025                 MatrixN(const VectorN& v, bool transpose);
00026                 virtual ~MatrixN() { }
00027                 VectorN get_row(unsigned i) const;
00028                 VectorN get_column(unsigned i) const;
00029                 void get_row(unsigned i, VectorN& result) const;
00030                 void get_column(unsigned i, VectorN& result) const;
00031                 unsigned rows() const { return _rows; }
00032                 unsigned columns() const { return _columns; }
00033                 void resize(unsigned rows, unsigned columns, bool preserve = false);
00034                 void set_row(unsigned i, const VectorN& v);
00035                 void set_column(unsigned i, const VectorN& v);
00036                 void set_sub_matrix(unsigned row_start, unsigned col_start, const MatrixN& m);
00037                 MatrixN get_sub_matrix(unsigned row_start, unsigned row_end, unsigned col_start, unsigned col_end) const;
00038                 bool epsilon_equals(const MatrixN& m, Real epsilon);
00039                 static bool epsilon_equals(const MatrixN& m1, const MatrixN& m2, Real epsilon);
00040                 static MatrixN zero(unsigned rows, unsigned columns);
00041                 void set_zero();
00042                 virtual void transpose();
00043                 static MatrixN transpose(const MatrixN& m);
00044                 void augment_rows(const MatrixN& m);
00045                 void augment_rows(const VectorN& v);
00046                 void augment_columns(const MatrixN& m);
00047                 void augment_columns(const VectorN& v);
00048                 virtual void operator=(const MatrixN& source);
00049                 VectorN operator*(const VectorN& v) const;
00050                 static void mult(const MatrixN& m1, const MatrixN& m2, MatrixN& result);
00051                 static void mult(const MatrixN& m, const VectorN& v, VectorN& result);
00052                 static void mult_transpose(const MatrixN& m, const VectorN& v, VectorN& result);
00053                 static MatrixN mult(const MatrixN& m1, const MatrixN& m2);
00054                 static VectorN mult(const MatrixN& m, const VectorN& v);
00055                 static VectorN mult_transpose(const MatrixN& m, const VectorN& v);
00056                 MatrixN operator*(const MatrixN& m) const { return mult(*this, m); }
00057                 MatrixN operator*(Real scalar) const;
00058                 MatrixN operator/(Real scalar) const { return operator*(1.0/scalar); }
00059                 boost::shared_array<Real> operator*(boost::shared_array<Real> array) const;
00060                 MatrixN operator+(const MatrixN& m) const;
00061                 void operator+=(const MatrixN& m);
00062                 MatrixN operator-(const MatrixN& m) const;
00063                 MatrixN operator-() const;
00064                 void operator-=(const MatrixN& m);
00065                 void operator/=(Real scalar);
00066                 void operator*=(Real scalar);
00067                 void operator*=(const MatrixN& m);
00068                 Real& operator()(const unsigned i, const unsigned j) { assert(i < _rows && j < _columns); return _data[j*_rows+i]; }
00069                 Real operator()(const unsigned i, const unsigned j) const { assert(i < _rows && j < _columns); return _data[j*_rows+i]; }
00070                 boost::shared_array<Real>& data() { return _data; }
00071                 const boost::shared_array<Real>& data() const { return _data; }         
00072 
00073         protected:
00074                 boost::shared_array<Real> _data;
00075                 unsigned _rows;
00076                 unsigned _columns;
00077 };
00078 
00079 std::ostream& operator<<(std::ostream& out, const MatrixN& m);
00080 }
00081 
00082 #endif
00083 

Generated on Wed Oct 24 14:54:21 2007 for Physsim by  doxygen 1.5.1