#define MSP_LINAL_DYNAMICMATRIX_H_
#include <algorithm>
+#include <ostream>
#include "dynamicvector.h"
#include "matrixops.h"
DynamicMatrix &operator+=(const DynamicMatrix &);
DynamicMatrix &operator-=(const DynamicMatrix &);
- DynamicMatrix &exchange_rows(unsigned, unsigned);
- DynamicMatrix &multiply_row(unsigned, T);
- DynamicMatrix &add_row(unsigned, unsigned, T);
+ DynamicMatrix &exchange_columns(unsigned, unsigned);
+ DynamicMatrix &multiply_column(unsigned, T);
+ DynamicMatrix &add_column(unsigned, unsigned, T);
DynamicMatrix &invert();
};
}
template<typename T>
-inline DynamicMatrix<T> &DynamicMatrix<T>::exchange_rows(unsigned i, unsigned j)
+inline DynamicMatrix<T> &DynamicMatrix<T>::exchange_columns(unsigned i, unsigned j)
{
- if(i>=rows_ || j>=rows_)
- throw std::out_of_range("DynamicMatrix::exchange_rows");
+ if(i>=columns_ || j>=columns_)
+ throw std::out_of_range("DynamicMatrix::exchange_columns");
using std::swap;
for(unsigned k=0; k<columns_; ++k)
- swap(element(i, k), element(j, k));
+ swap(element(k, i), element(k, j));
return *this;
}
template<typename T>
-inline DynamicMatrix<T> &DynamicMatrix<T>::multiply_row(unsigned i, T s)
+inline DynamicMatrix<T> &DynamicMatrix<T>::multiply_column(unsigned i, T s)
{
- if(i>=rows_)
- throw std::out_of_range("DynamicMatrix::multiply_row");
+ if(i>=columns_)
+ throw std::out_of_range("DynamicMatrix::multiply_column");
for(unsigned k=0; k<columns_; ++k)
- element(i, k) *= s;
+ element(k, i) *= s;
return *this;
}
template<typename T>
-inline DynamicMatrix<T> &DynamicMatrix<T>::add_row(unsigned i, unsigned j, T s)
+inline DynamicMatrix<T> &DynamicMatrix<T>::add_column(unsigned i, unsigned j, T s)
{
- if(i>=rows_ || j>=rows_)
- throw std::out_of_range("DynamicMatrix::exchange_rows");
+ if(i>=columns_ || j>=columns_)
+ throw std::out_of_range("DynamicMatrix::exchange_columns");
for(unsigned k=0; k<columns_; ++k)
- element(j, k) += element(i, k)*s;
+ element(k, j) += element(k, i)*s;
return *this;
}
for(unsigned i=0; i<rows_; ++i)
r(i, i) = T(1);
- return gauss_jordan(*this, r);
+ gauss_jordan(*this, r);
+ return *this = r;
}
template<typename T>
return r.invert();
}
+template<typename T>
+inline std::ostream &operator<<(std::ostream &s, const DynamicMatrix<T> &m)
+{
+ s << "DynamicMatrix" << m.rows() << 'x' << m.columns() << '(';
+ for(unsigned i=0; i<m.columns(); ++i)
+ {
+ if(i)
+ s << ", ";
+ s << '[';
+ for(unsigned j=0; j<m.rows(); ++j)
+ {
+ if(j)
+ s << ", ";
+ s << m(j, i);
+ }
+ s << ']';
+ }
+ s << ')';
+ return s;
+}
+
} // namespace LinAl
} // namespace Msp