]> git.tdb.fi Git - libs/math.git/blobdiff - source/linal/squarematrix.h
Rename the low-level matrix inversion function to gauss_jordan
[libs/math.git] / source / linal / squarematrix.h
index 6cda86a5baa6b202ec00dba93acb0a152b03a985..b8531aafcb8359bcda6ea35628a9f561f77b677b 100644 (file)
@@ -1,26 +1,64 @@
 #ifndef MSP_LINAL_SQUAREMATRIX_H_
 #define MSP_LINAL_SQUAREMATRIX_H_
 
+#include <cmath>
 #include "matrix.h"
+#include "matrixops.h"
 
 namespace Msp {
 namespace LinAl {
 
+/**
+A mathematical matrix with S rows and columns.  Some operations are provided
+here that are only possible for square matrices.
+*/
 template<typename T, unsigned S>
 class SquareMatrix: public Matrix<T, S, S>
 {
 public:
-       SquareMatrix();
-       SquareMatrix(const T *);
+       SquareMatrix() { }
+       SquareMatrix(const T *d): Matrix<T, S, S>(d) { }
        template<typename U>
-       SquareMatrix(const Matrix<U, S, S> &);
+       SquareMatrix(const Matrix<U, S, S> &m): Matrix<T, S, S>(m) { }
+
        static SquareMatrix identity();
 
        SquareMatrix &operator*=(const SquareMatrix &);
 
-       void invert();
+       SquareMatrix &invert();
 };
 
+template<typename T, unsigned S>
+inline SquareMatrix<T, S> SquareMatrix<T, S>::identity()
+{
+       SquareMatrix<T, S> m;
+       for(unsigned i=0; i<S; ++i)
+               m(i, i) = T(1);
+       return m;
+}
+
+template<typename T, unsigned S>
+SquareMatrix<T, S> &SquareMatrix<T, S>::operator*=(const SquareMatrix<T, S> &m)
+{
+       return *this = *this*m;
+}
+
+template<typename T, unsigned S>
+SquareMatrix<T, S> &SquareMatrix<T, S>::invert()
+{
+       SquareMatrix<T, S> r = identity();
+       gauss_jordan(*this, r);
+       return *this = r;
+}
+
+template<typename T, unsigned S>
+inline SquareMatrix<T, S> invert(const SquareMatrix<T, S> &m)
+{
+       SquareMatrix<T, S> temp = m;
+       SquareMatrix<T, S> r = SquareMatrix<T, S>::identity();
+       return gauss_jordan(temp, r);
+}
+
 } // namespace LinAl
 } // namespace Msp