Uso de Mx::Matrix:
 Todo Clases Namespaces Archivos Funciones Variables 'typedefs' Amigas 'defines'
Matrix_Lib.h
Ir a la documentación de este archivo.
1 // Matrix_Lib.h Copyright (C) 2004 adolfo@di-mare.com
2 
3 #ifdef Spanish_dox
4 /** \file Matrix_Lib.h
5  \brief Funciones para manipular \c Matrix_BASE<>.
6  \author Adolfo Di Mare <adolfo@di-mare.com>
7  \date 2004
8  - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04
9 */
10 #endif
11 #ifdef English_dox
12 /** \file Matrix_Lib.h
13  \brief Functions to manipulate \c Matrix_BASE<>.
14  \author Adolfo Di Mare <adolfo@di-mare.com>
15  \date 2004
16  - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04
17 */
18 #endif
19 
20 #ifndef Matrix_Lib_h
21 #define Matrix_Lib_h // Evita la inclusión múltiple
22 
23 #include <cassert> // assert()
24 
25 namespace Mx {
26 
27 #ifdef Spanish_dox
28 /// Retorna \c "true" si la matriz \c M[][] es una matriz cuadrada.
29 #endif
30 #ifdef English_dox
31 /// Returns \c "true" if matrix \c M[][] is square.
32 #endif
33 template <class MAT>
34 bool isSquare( const MAT& M ) {
35  return M.rows() == M.cols();
36 }
37 
38 #ifdef Spanish_dox
39 /// Retorna \c "true" si la matriz \c M[][] es una matriz diagonal.
40 #endif
41 #ifdef English_dox
42 /// Returns \c "true" if matrix \c M[][] is diagonal.
43 #endif
44 template <class MAT>
45 bool isDiagonal( const MAT& M ) {
46  assert( "This code has not been tested" );
47  if (M.rows() != M.cols()) {
48  return false;
49  }
50  typename MAT::value_type ZERO = 0;
51  for (unsigned i=0; i < M.rows(); i++) {
52  for (unsigned j=0; j < i; j++) {
53  if (M(i,j) != ZERO) {
54  return false;
55  } else if (M(j,i) != ZERO) {
56  return false;
57  }
58  }
59  }
60  return true;
61 }
62 
63 #ifdef Spanish_dox
64 /// Retorna \c "true" si la matriz \c M[][] es escalar.
65 #endif
66 #ifdef English_dox
67 /// Returns \c "true" if matrix \c M[][] is scalar.
68 #endif
69 template <class MAT>
70 bool isScalar( const MAT& M ) {
71  assert( "This code has not been tested" );
72  if ( ! isDiagonal( M ) ) {
73  return false;
74  }
75  typename MAT::value_type S = M(0,0);
76  for (unsigned i=1; i < M.rows(); i++) {
77  if (M(i,i) != S) {
78  return false;
79  }
80  }
81  return true;
82 }
83 
84 #ifdef Spanish_dox
85 /// Retorna \c "true" si la matriz \c M[][] es unitaria.
86 #endif
87 #ifdef English_dox
88 /// Returns \c "true" if matrix \c M[][] is a unit matrix.
89 #endif
90 template <class MAT>
91 inline bool isUnit( const MAT& M ) {
92  assert( "This code has not been tested" );
93  typename MAT::value_type ONE = 1;
94  return ( ONE == M(0,0) ? isScalar( M ) : false );
95 }
96 
97 #ifdef Spanish_dox
98 /// Convierte a \c M[][] en una matriz identidad de tamaño \c n x \c n.
99 #endif
100 #ifdef English_dox
101 /// Transforms \c M[][] into a identity matrix of size \c n x \c n.
102 #endif
103 template <class MAT>
104 void setUnit( MAT& M , unsigned n ) {
105  assert( "This code has not been tested" );
106  M.reSize(n,n);
107 
108  for (unsigned i=0; i < M.rows(); ++i) {
109  for (unsigned j=0; j < i; ++j) {
110  M(i,j) = M(j,i) = typename MAT::value_type();
111  }
112  M(i,i) = typename MAT::value_type(1);
113  }
114 }
115 
116 #ifdef Spanish_dox
117 /// Retorna \c "true" si la matriz \c M[][] es nula.
118 #endif
119 #ifdef English_dox
120 /// Returns \c "true" if matrix \c M[][] is null.
121 #endif
122 template <class MAT>
123 bool isNull( const MAT& M ) {
124  assert( "This code has not been tested" );
125  typename MAT::value_type ZERO = 0;
126  for (unsigned i=0; i < M.rows(); i++) {
127  for (unsigned j=0; j < M.cols(); j++) {
128  if (M(i,j) != ZERO) {
129  return false;
130  }
131  }
132  }
133  return true;
134 }
135 
136 #ifdef Spanish_dox
137 /// Retorna \c "true" si la matriz \c M[][] es simétrica.
138 #endif
139 #ifdef English_dox
140 /// Returns \c "true" if matrix \c M[][] is symetric.
141 #endif
142 template <class MAT>
143 bool isSymmetric( const MAT& M ) {
144  assert( "This code has not been tested" );
145  if (M.rows() != M.cols()) {
146  return false;
147  }
148  for (unsigned i=0; i < M.rows(); i++) {
149  for (unsigned j=0; j < i; j++) {
150  if (M(i,j) != M(j,i)) {
151  return false;
152  }
153  }
154  }
155  return true;
156 }
157 
158 #ifdef Spanish_dox
159 /// Retorna \c "true" si la matriz \c M[][] es triangular superior.
160 #endif
161 #ifdef English_dox
162 /// Returns \c "true" if matrix \c M[][] is upper triangular.
163 #endif
164 template <class MAT>
165 bool isUpperTriangular( const MAT& M ) {
166  assert( "This code has not been tested" );
167  if (M.rows() != M.cols()) {
168  return false;
169  }
170 
171  typename MAT::value_type ZERO = 0;
172  for (unsigned i=1; i < M.rows(); i++) {
173  for (unsigned j=0; j < i; j++) {
174  if (M(i,j) != ZERO) {
175  return false;
176  }
177  }
178  }
179  return true;
180 }
181 
182 #ifdef Spanish_dox
183 /// Retorna \c "true" si la matriz \c M[][] es triangular inferior.
184 #endif
185 #ifdef English_dox
186 /// Returns \c "true" if matrix \c M[][] is lower triangular.
187 #endif
188 template <class MAT>
189 bool isLowerTriangular( const MAT& M ) {
190  assert( "This code has not been tested" );
191  if (M.rows() != M.cols()) {
192  return false;
193  }
194 
195  typename MAT::value_type ZERO = 0;
196  for (unsigned j=1; j < M.cols(); j++) {
197  for (unsigned i=0; i < j; i++) {
198  if (M(i,j) != ZERO) {
199  return false;
200  }
201  }
202  }
203  return true;
204 }
205 
206 } // namespace Mx
207 
208 
209 #endif // Matrix_Lib_h
210 
211 // EOF: Matrix_Lib.h
bool isUpperTriangular(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es triangular superior.
Definition: Matrix_Lib.h:165
bool isDiagonal(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es una matriz diagonal.
Definition: Matrix_Lib.h:45
void setUnit(MAT &M, unsigned n)
Convierte a M[][] en una matriz identidad de tamaño n x n.
Definition: Matrix_Lib.h:104
bool isNull(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es nula.
Definition: Matrix_Lib.h:123
bool isLowerTriangular(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es triangular inferior.
Definition: Matrix_Lib.h:189
bool isSquare(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es una matriz cuadrada.
Definition: Matrix_Lib.h:34
bool isUnit(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es unitaria.
Definition: Matrix_Lib.h:91
bool isSymmetric(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es simétrica.
Definition: Matrix_Lib.h:143
bool isScalar(const MAT &M)
Retorna &quot;true&quot; si la matriz M[][] es escalar.
Definition: Matrix_Lib.h:70