00001
00002
00003
00004
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