X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flinal%2Fmatrix.h;h=daf9cb898e04393f2fc2d0f4d75b52d69bca4b94;hb=2feea51b078cc53663e411bf80e35044c1ef4a07;hp=83a64f50dd767ff1497804378be48160e8691ed0;hpb=03f70f6ba9622bb2840a14fc50ac72201cc533b5;p=libs%2Fmath.git diff --git a/source/linal/matrix.h b/source/linal/matrix.h index 83a64f5..daf9cb8 100644 --- a/source/linal/matrix.h +++ b/source/linal/matrix.h @@ -8,11 +8,14 @@ namespace Msp { namespace LinAl { /** -A general mathematical matrix. +A general mathematical matrix with M rows and N columns. */ template class Matrix { +public: + typedef T ElementType; + private: T data[M*N]; @@ -25,11 +28,23 @@ public: static Matrix from_columns(const Vector *); static Matrix from_rows(const Vector *); + unsigned rows() const { return M; } + unsigned columns() const { return N; } + T &element(unsigned i, unsigned j) { return data[i+M*j]; } const T &element(unsigned i, unsigned j) const { return data[i+M*j]; } T &operator()(unsigned i, unsigned j) { return element(i, j); } const T &operator()(unsigned i, unsigned j) const { return element(i, j); } + Vector column(unsigned i) const { return Vector(data+M*i); } + Vector row(unsigned i) const { return Vector(data+i, M); } + + template + Matrix select(const Vector &, const Vector &) const; + + template + Matrix block(unsigned, unsigned) const; + Matrix &operator*=(T); Matrix &operator/=(T); Matrix &operator+=(const Matrix &); @@ -68,6 +83,7 @@ inline Matrix Matrix::from_columns(const Vector *v) for(unsigned i=0; i @@ -77,6 +93,29 @@ inline Matrix Matrix::from_rows(const Vector *v) for(unsigned i=0; i +template +inline Matrix Matrix::select(const Vector &row_indices, const Vector &col_indices) const +{ + Matrix r; + for(unsigned j=0; j +template +inline Matrix Matrix::block(unsigned y, unsigned x) const +{ + Matrix r; + for(unsigned j=0; j @@ -189,8 +228,9 @@ inline bool operator==(const Matrix &a, const Matrix &b) template inline Matrix &Matrix::exchange_rows(unsigned i, unsigned j) { + using std::swap; for(unsigned k=0; k