File: StairCaseMatrix.hh

package info (click to toggle)
topcom 0.17.8%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 78,572 kB
  • sloc: cpp: 16,640; sh: 975; makefile: 345; ansic: 40
file content (105 lines) | stat: -rw-r--r-- 3,106 bytes parent folder | download
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