1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
////////////////////////////////////////////////////////////////////////////////
//
// StairCaseMatrix.hh
//
// produced: 21/08/97 jr
// last change: 30/10/97 jr
//
////////////////////////////////////////////////////////////////////////////////
#ifndef STAIRCASEMATRIX_HH
#define STAIRCASEMATRIX_HH
#include <assert.h>
#include "CommandlineOptions.hh"
#include "Vector.hh"
#include "Matrix.hh"
class StairCaseMatrix : public Matrix {
private:
Field _coefficient;
public:
// constructors:
inline StairCaseMatrix();
inline StairCaseMatrix(const StairCaseMatrix&);
inline StairCaseMatrix(const Vector&);
inline StairCaseMatrix(const size_type&,
const size_type&,
const Field& init_entry = ZERO);
// accessors:
inline const Field& coefficient() const;
// in place operations:
StairCaseMatrix& augment(const Matrix&);
// out of place operations:
inline bool has_full_rank() const;
friend const Field det(const StairCaseMatrix&);
// iostream:
std::ostream& pretty_print(std::ostream& ost);
friend std::ostream& operator<<(std::ostream& ost, const StairCaseMatrix& matrix);
private:
// internal elimination step:
void _eliminate(const size_type&, const size_type&, const size_type&);
// forbid in place operations if result is of type StairCaseMatrix:
inline StairCaseMatrix& add(const StairCaseMatrix&);
inline StairCaseMatrix& scale(const Field&);
inline StairCaseMatrix& stack(const StairCaseMatrix&);
inline StairCaseMatrix& swap_cols(const size_type, const size_type);
inline StairCaseMatrix& swap_rows(const size_type, const size_type);
};
inline StairCaseMatrix::StairCaseMatrix() :
Matrix(), _coefficient(ONE) {
}
inline StairCaseMatrix::StairCaseMatrix(const StairCaseMatrix& matrix) :
Matrix(matrix), _coefficient(matrix._coefficient) {
}
inline StairCaseMatrix::StairCaseMatrix(const Vector& vector) :
Matrix(vector), _coefficient(ONE) {
}
inline StairCaseMatrix::StairCaseMatrix(const size_type& init_rows,
const size_type& init_cols,
const Field& init_entry) :
Matrix(init_rows, init_cols) , _coefficient(ONE) {
}
inline const Field& StairCaseMatrix::coefficient() const {
return _coefficient;
}
inline bool StairCaseMatrix::has_full_rank() const {
if (coldim() == 0) {
return true;
}
else {
return (!(*this)[coldim()-1].is_zero());
}
}
// private in place operations (senseless in general; only for internal use):
inline StairCaseMatrix& StairCaseMatrix::add(const StairCaseMatrix& matrix) {
Matrix::add(matrix);
return *this;
}
inline StairCaseMatrix& StairCaseMatrix::scale(const Field& scalar) {
Matrix::scale(scalar);
return *this;
}
inline StairCaseMatrix& StairCaseMatrix::stack(const StairCaseMatrix& matrix) {
Matrix::stack(matrix);
return *this;
}
inline StairCaseMatrix& StairCaseMatrix::swap_cols(const size_type j1, const size_type j2) {
Matrix::swap_cols(j1, j2);
return *this;
}
inline StairCaseMatrix& StairCaseMatrix::swap_rows(const size_type i1, const size_type i2) {
Matrix::swap_rows(i1, i2);
return *this;
}
#endif
// eof StairCaseMatrix.hh
|