X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flinal%2Fmatrix.h;h=2711d40a637489c1bfa3cc9676c2fb8043f978d4;hb=9ab061034720c1c0db4e8bff5dae4191ccd2a26f;hp=00e960d9ce8111de4d88bd0bf664d470183f442c;hpb=839a88cd2b9a2f054323627c4e76cdcefc652c63;p=libs%2Fmath.git diff --git a/source/linal/matrix.h b/source/linal/matrix.h index 00e960d..2711d40 100644 --- a/source/linal/matrix.h +++ b/source/linal/matrix.h @@ -1,17 +1,22 @@ -#ifndef MSP_LIEAL_MATMIX_H_ -#define MSP_LIEAL_MATMIX_H_ +#ifndef MSP_LINAL_MATRIX_H_ +#define MSP_LINAL_MATRIX_H_ +#include +#include #include "vector.h" 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]; @@ -20,30 +25,98 @@ public: Matrix(const T *); template Matrix(const Matrix &); + static Matrix from_columns(const Vector *); static Matrix from_rows(const Vector *); - T &operator()(unsigned, unsigned); - const T &operator()(unsigned, unsigned) const; + 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 &); Matrix &operator-=(const Matrix &); - Matrix transpose() const; + Matrix &exchange_rows(unsigned, unsigned); + Matrix &multiply_row(unsigned, T); + Matrix &add_row(unsigned, unsigned, T); }; template -inline T &Matrix::operator()(unsigned i, unsigned j) +inline Matrix::Matrix() +{ + std::fill(data, data+M*N, T()); +} + +template +inline Matrix::Matrix(const T *d) +{ + std::copy(d, d+M*N, data); +} + +template +template +inline Matrix::Matrix(const Matrix &other) +{ + for(unsigned i=0; i +inline Matrix Matrix::from_columns(const Vector *v) +{ + Matrix m; + for(unsigned i=0; i +inline Matrix Matrix::from_rows(const Vector *v) +{ + Matrix m; + for(unsigned i=0; i +template +inline Matrix Matrix::select(const Vector &row_indices, const Vector &col_indices) const { - return data[i+M*j]; + Matrix r; + for(unsigned j=0; j -inline const T &Matrix::operator()(unsigned i, unsigned j) const +template +inline Matrix Matrix::block(unsigned y, unsigned x) const { - return data[i+M*j]; + Matrix r; + for(unsigned j=0; j @@ -67,6 +140,37 @@ inline Matrix operator*(T s, const Matrix &m) return m*s; } +template +inline Matrix operator*(const Matrix &m1, const Matrix &m2) +{ + Matrix r; + for(unsigned i=0; i +inline Vector operator*(const Matrix &m, const Vector &v) +{ + Vector r; + for(unsigned i=0; i +inline Vector operator*(const Vector &v, const Matrix &m) +{ + Vector r; + for(unsigned j=0; j inline Matrix &Matrix::operator/=(T s) { @@ -112,37 +216,72 @@ inline Matrix operator-(const Matrix &m1, const Matrix -Matrix operator*(const Matrix &m1, const Matrix &m2) +template +inline bool operator==(const Matrix &a, const Matrix &b) { - Matrix r; - for(unsigned i=0; i -Vector operator*(const Matrix &m, const Vector &v) +inline Matrix &Matrix::exchange_rows(unsigned i, unsigned j) { - Vector r; - for(unsigned i=0; i -Vector operator*(const Vector &v, const Matrix &m) +inline Matrix &Matrix::multiply_row(unsigned i, T s) { - Vector r; + for(unsigned k=0; k +inline Matrix &Matrix::add_row(unsigned i, unsigned j, T s) +{ + for(unsigned k=0; k +inline Matrix transpose(const Matrix &m) +{ + Matrix r; for(unsigned j=0; j +inline std::ostream &operator<<(std::ostream &s, const Matrix &m) +{ + s << "Matrix" << M << 'x' << N << '('; + for(unsigned i=0; i