|
La Matriz Abstracta no Polimorfica:
|
Matriz chirrisquitica de adolfo@di-mare.com. Más...
Clases | |
| class | Matrix_BASE |
| Esta es la plantilla base para las implementacion de la clase matriz chirrisquitica. Más... | |
| class | Matrix_Dense |
| Esta es una clase matriz muy chirrisquitica que puede cambiar dinámicamente de tamaño. Más... | |
| class | Matrix_List_ColVal |
| Clase privada para implementar la lista de valores de cada fila. Más... | |
| class | Matrix_List |
| Matriz muy chirrisquitica almacenada como matriz rala implementada con listas. Más... | |
| class | Matrix_Sparse |
| Matriz chirrisquitica almacenada como una matriz rala. Más... | |
Funciones | |
| template<class MAT > | |
| bool | check_ok_Matrix (const MAT &M) |
Verificación genérica de la invariante de la clase check_ok(). | |
| template<class MAT > | |
| unsigned | count_Matrix (const MAT &M) |
Implementación por defecto para Matrix_BASE<E>::count() | |
| template<class MAT > | |
| void | clear_Matrix (MAT &M) |
Implementación por defecto para Matrix_BASE<E>::clear() | |
| template<class MAT > | |
| bool | equals_Matrix (const MAT &A, const MAT &B) |
Implementación por defecto para Matrix_BASE<E>::operator==() | |
| template<class MAT > | |
| void | add_Matrix (MAT &Res, const MAT &M) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) | |
| template<class MAT > | |
| void | substract_Matrix (MAT &Res, const MAT &M) |
Implementación por defecto para operator-( Matrix_BASE<E>&, Matrix_BASE<E> ) | |
| template<class MAT > | |
| void | multiply_Matrix (MAT &Res, const MAT &A, const MAT &B) |
Calcula la multiplicación A * B y almacena el resultado en "Res". | |
| template<class MAT > | |
| MAT::reference | at_Matrix (MAT &M, unsigned i, unsigned j) |
Implementación por defecto para Matrix_BASE<E>::at() | |
| template<class MAT > | |
| MAT::const_reference | at_Matrix (const MAT &M, unsigned i, unsigned j) |
Implementación por defecto para Matrix_BASE<E>::at() const. | |
| template<class MAT > | |
| MAT | operator+ (const Matrix_BASE< typename MAT::value_type > &A, const MAT &B) |
A+B | |
| template<class MAT > | |
| MAT | operator- (const Matrix_BASE< typename MAT::value_type > &A, const MAT &B) |
A-B | |
| template<class MAT > | |
| MAT | operator* (const Matrix_BASE< typename MAT::value_type > &A, const MAT &B) |
Res=A*B | |
| template<class MAT > | |
| bool | operator== (const Matrix_BASE< typename MAT::value_type > &A, const MAT &B) |
| ¿¿¿ (A == B) ??? | |
| template<class MAT > | |
| bool | operator!= (const Matrix_BASE< typename MAT::value_type > &A, const MAT &B) |
| ¿¿¿ (A != B) ??? | |
| template<class MAT > | |
| bool | isSquare (const MAT &M) |
Retorna "true" si la matriz M[][] es una matriz cuadrada. | |
| template<class MAT > | |
| bool | isDiagonal (const MAT &M) |
Retorna "true" si la matriz M[][] es una matriz diagonal. | |
| template<class MAT > | |
| bool | isScalar (const MAT &M) |
Retorna "true" si la matriz M[][] es escalar. | |
| template<class MAT > | |
| bool | isUnit (const MAT &M) |
Retorna "true" si la matriz M[][] es unitaria. | |
| template<class MAT > | |
| void | setUnit (const MAT &M, unsigned n) |
Convierte a M[][] en una matriz identidad de tamaño n x n. | |
| template<class MAT > | |
| bool | isNull (const MAT &M) |
Retorna "true" si la matriz M[][] es nula. | |
| template<class MAT > | |
| bool | isSymmetric (const MAT &M) |
Retorna "true" si la matriz M[][] es simétrica. | |
| template<class MAT > | |
| bool | isUpperTiangular (const MAT &M) |
Retorna "true" si la matriz M[][] es triangular superior. | |
| template<class MAT > | |
| bool | isLowerTiangular (const MAT &M) |
Retorna "true" si la matriz M[][] es triangular inferior. | |
| template<class T > | |
| bool | check_ok (const Matrix_Dense< T > &M) |
| Verifica la invariante de la clase. | |
| template<class T > | |
| void | add_Matrix (Matrix_Dense< T > &Res, const Matrix_Dense< T > &M) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) | |
| template<class T > | |
| bool | check_ok (const Matrix_List< T > &M) |
Verificación genérica de la invariante de la clase check_ok(). | |
| template<class T > | |
| bool | check_ok (const Matrix_Sparse< T > &M) |
| Verifica la invariante de la clase. | |
| template<class T > | |
| void | add_Matrix (Matrix_Sparse< T > &Res, const Matrix_Sparse< T > &M) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) | |
Matriz chirrisquitica de adolfo@di-mare.com.
| bool Mx::check_ok_Matrix | ( | const MAT & | M | ) |
Verificación genérica de la invariante de la clase check_ok().
Ok()
&M != 0 .(M.rows() == 0) <==> (M.cols() == 0)check_ok( M(i,j) ) Definición en la línea 140 del archivo Matrix_BASE.h.
| unsigned Mx::count_Matrix | ( | const MAT & | M | ) |
Implementación por defecto para Matrix_BASE<E>::count()
Definición en la línea 167 del archivo Matrix_BASE.h.
| void Mx::clear_Matrix | ( | MAT & | M | ) |
Implementación por defecto para Matrix_BASE<E>::clear()
Definición en la línea 178 del archivo Matrix_BASE.h.
| bool Mx::equals_Matrix | ( | const MAT & | A, |
| const MAT & | B | ||
| ) |
Implementación por defecto para Matrix_BASE<E>::operator==()
Definición en la línea 190 del archivo Matrix_BASE.h.
| void Mx::add_Matrix | ( | MAT & | Res, |
| const MAT & | M | ||
| ) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> )
"*this" y "M" deben tener las mismas dimensiones. rows() == M.rows() && cols() == M.cols() . Matrix_BASE<E> operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) .Definición en la línea 239 del archivo Matrix_BASE.h.
| void Mx::substract_Matrix | ( | MAT & | Res, |
| const MAT & | M | ||
| ) |
Implementación por defecto para operator-( Matrix_BASE<E>&, Matrix_BASE<E> )
Definición en la línea 259 del archivo Matrix_BASE.h.
| void Mx::multiply_Matrix | ( | MAT & | Res, |
| const MAT & | A, | ||
| const MAT & | B | ||
| ) |
Calcula la multiplicación A * B y almacena el resultado en "Res".
"*this" se ajustan de manera que: Res.rows() == A.rows() && Res.cols() == B.cols() Matrix_BASE<E> operator*() ."A" y "B" deben tener dimensiones compatibles. A.cols() == B.rows() ."A" debe ser igual a la cantidad de columnas de "B". A.cols() * B.cols() * A.cols() ) Definición en la línea 307 del archivo Matrix_BASE.h.
| MAT::reference Mx::at_Matrix | ( | MAT & | M, |
| unsigned | i, | ||
| unsigned | j | ||
| ) |
Implementación por defecto para Matrix_BASE<E>::at()
Definición en la línea 335 del archivo Matrix_BASE.h.
| MAT::const_reference Mx::at_Matrix | ( | const MAT & | M, |
| unsigned | i, | ||
| unsigned | j | ||
| ) |
Implementación por defecto para Matrix_BASE<E>::at() const.
Definición en la línea 354 del archivo Matrix_BASE.h.
| MAT Mx::operator+ | ( | const Matrix_BASE< typename MAT::value_type > & | A, |
| const MAT & | B | ||
| ) | [inline] |
A+B
Definición en la línea 368 del archivo Matrix_BASE.h.
| MAT Mx::operator- | ( | const Matrix_BASE< typename MAT::value_type > & | A, |
| const MAT & | B | ||
| ) | [inline] |
A-B
Definición en la línea 448 del archivo Matrix_BASE.h.
| MAT Mx::operator* | ( | const Matrix_BASE< typename MAT::value_type > & | A, |
| const MAT & | B | ||
| ) | [inline] |
Res=A*B
Definición en la línea 454 del archivo Matrix_BASE.h.
| bool Mx::operator== | ( | const Matrix_BASE< typename MAT::value_type > & | A, |
| const MAT & | B | ||
| ) | [inline] |
¿¿¿ (A == B) ???
Definición en la línea 460 del archivo Matrix_BASE.h.
| bool Mx::operator!= | ( | const Matrix_BASE< typename MAT::value_type > & | A, |
| const MAT & | B | ||
| ) | [inline] |
¿¿¿ (A != B) ???
Definición en la línea 466 del archivo Matrix_BASE.h.
| bool Mx::isSquare | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es una matriz cuadrada.
Definición en la línea 32 del archivo Matrix_Lib.h.
| bool Mx::isDiagonal | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es una matriz diagonal.
Definición en la línea 43 del archivo Matrix_Lib.h.
| bool Mx::isScalar | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es escalar.
Definición en la línea 68 del archivo Matrix_Lib.h.
| bool Mx::isUnit | ( | const MAT & | M | ) | [inline] |
Retorna "true" si la matriz M[][] es unitaria.
Definición en la línea 89 del archivo Matrix_Lib.h.
| void Mx::setUnit | ( | const MAT & | M, |
| unsigned | n | ||
| ) |
Convierte a M[][] en una matriz identidad de tamaño n x n.
Definición en la línea 102 del archivo Matrix_Lib.h.
| bool Mx::isNull | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es nula.
Definición en la línea 121 del archivo Matrix_Lib.h.
| bool Mx::isSymmetric | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es simétrica.
Definición en la línea 141 del archivo Matrix_Lib.h.
| bool Mx::isUpperTiangular | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es triangular superior.
Definición en la línea 163 del archivo Matrix_Lib.h.
| bool Mx::isLowerTiangular | ( | const MAT & | M | ) |
Retorna "true" si la matriz M[][] es triangular inferior.
Definición en la línea 187 del archivo Matrix_Lib.h.
| bool Mx::check_ok | ( | const Matrix_Dense< T > & | M | ) |
Verifica la invariante de la clase.
{{ // Rep ==> Diagrama de la clase
+---+ / \
| 2 | M(i,j) ==> m_val[ (i * m_cols) + j ] | 0 1 2 3 | m_rows == 2
+---+ (almacenamiento por filas) | 4 5 6 7 | m_cols == 4
| 4 | \ /
+---+ +---+---+---+---+---+---+---+---+
| *-|-->| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+ +---+---+---+---+---+---+---+---+
+---+
| 4 | M(i,j) ==> m_val[ i + (j * m_rows) ] / a e \
+---+ (almacenamiento por columnas) | b f | m_rows == 4
| 2 | | c g | m_cols == 2
+---+ +---+---+---+---+---+---+---+---+ \ d h /
| *-|-->| a | b | c | d | e | f | g | h |
+---+ +---+---+---+---+---+---+---+---+
}}
Ok()
&M != 0 .(M.m_rows == 0) <==> (M.m_cols == 0)(M.m_rows == 0) <==> (M.m_val == 0)check_ok( m_val[k] ) Definición en la línea 140 del archivo Matrix_Dense.h.
| void Mx::add_Matrix | ( | Matrix_Dense< T > & | Res, |
| const Matrix_Dense< T > & | M | ||
| ) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> )
"*this" y "M" deben tener las mismas dimensiones. rows() == M.rows() && cols() == M.cols() . Matrix_BASE<E> operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) .Definición en la línea 394 del archivo Matrix_Dense.h.
| bool Mx::check_ok | ( | const Matrix_List< T > & | M | ) |
Verificación genérica de la invariante de la clase check_ok().
Ok()
- El campo \c m_same indica cuál es el valor que se repite más en toda la matriz. - Usualmente \c m_same es el neutro aditivo \c value_type(). - No existe un constructor explícito para darle a \c m_same su valor inicial, que es siempre inicializado en \c value_type(). Para cambiarlo es necesario invocar el método \c setgetDefault(). - El vector \c m_VL[] contiene las listas de valores almacenados en la matriz. Cualquiera de estas listas puede estar vacía; aún todas pueden ser listas vacías. - La cantidad de columnas de la matriz es el valor fijo es \c m_cols. - El largo de las listas de valores cambia cuando se hace referencia a un valor M(i,j) mediante la versión que no es \c const del \c operator()(i,j). O sea, que es ese método el encargado de agregar valores en \c m_VL[], pues el operador homónimo \c const operator()(i,j) nunca agrega nada y, como es \c const, en general retorna una referencia constante a \c m_same. - Es posible que la matriz tenga dimensiones nulas, lo que implica que el vector \c m_VL[] está vacío. - No hace falta alacenar la cantidad de valores de la matriz porque se siempre es \c m_VL.size(). el valor \c 0 (cero) al campo \c m_capacity. \par <em>Rep</em> Modelo de la clase
m_VL<list<>> _______
+---+ / \
0 | *-|---| 1 , 'a' |
+---+ \_______/ 0 1 2 3 4 5 6
1 | ? | M(0,1)=='a' 0 / - a - - - - - \
+---+ 1 | - - - - - - - |
2 | ? | _______ _______ 2 | - - - - - - - |
+---+ / \ / \ 3 | - c - - - b - |
3 | *-|---| 5 , 'b' |---| 1 , 'c' | 4 \ - - - - - - - /
+---+ \_______/ \_______/
4 | ? | M(3,5)=='b' M(3,1)=='c'
+---+
m_same == '-' rows() == m_VL.size() m_cols == 7
Ok() (m_cols == 0) <==> (m_VL.empty())check_ok( M.m_same ) Definición en la línea 187 del archivo Matrix_List.h.
| bool Mx::check_ok | ( | const Matrix_Sparse< T > & | M | ) |
Verifica la invariante de la clase.
- El campo \c m_same indica cuál es el valor que se repite más en toda la matriz. - Usualmente \c same es el neutro aditivo \c value_type(). - No existe un constructor explícito para darle a \c m_same su valor inicial, que es siempre inicializado en \c value_type(). Para cambiarlo es necesario invocar el método \c setgetDefault(). - Los vectores \c m_I[], \c m_J[] y \c m_val[] son vectores paralelos, todos de longitud \c Matrix_Sparse::m_capacity. - La cantidad máxima de valores diferente que pueden ser almacenados en la matriz es \c Matrix_Sparse::m_capacity. - El largo de estos vectores aumenta cuando se hace referencia a un valor M(i,j) mediante la versión que no es \c const del \c operator()(i,j). O sea, que es ese método el encargado de agregar valores en \c m_val[], pues el operador homónimo \c const operator()(i,j) nunca agrega nada y, como es \c const, en general retorna una referencia constante a \c m_same. - Es posible que la matriz tenga dimensiones nulas, lo que implica que todos los punteros a los vectors paralelos deben ser nulos. Este hecho se marca dándolo el valor \c 0 (cero) al campo \c m_capacity. - En todos los algoritmos, "m" o "m_rows" es la cantidad de filas == \c rows() - En todos los algoritmos, "n" o "m_cols" es la cantidad de columnas == \c cols() \par <em>Rep</em> Modelo de la clase
____________________________________
/ m_capacity \
+---+---+---+---+---+---+-..-+---+---+ 0 1 2 3 4 5 6
m_I--->| 1 | 3 | 3 |'-'| ... ... |'-'| 0 / - - - - - - - \
+---+---+---+---+ ... ... +---+ 1 | - a - - - - - |
m_J--->| 1 | 2 | 1 |'-'| ... ... |'-'| 2 | - - - - - - - |
+---+---+---+---+ ... ... +---+ 3 | - c b - - - - |
m_val-->|'a'|'b'|'c'|'-'| ... ... |'-'| 4 \ - - - - - - - /
+---+---+---+---+---+---+-..-+---+---+
0 1 2 |
m_size--------+ == 3 m_same == '-' m_rows == 5 m_cols == 7
Ok() (m_capacity == 0) <==> (m_I == 0)(m_capacity == 0) <==> (m_J == 0)(m_capacity == 0) <==> (m_val == 0)(m_rows == 0) ==> (m_capacity == 0)(m_cols == 0) ==> (m_capacity == 0)(m_capacity != 0) <==> (m_I != 0)(m_capacity != 0) <==> (m_J != 0)(m_capacity != 0) <==> (m_val != 0)(m_rows == 0) <==> (m_cols == 0)( m_size <= m_capacity )check_ok (m_same)( (0<=m_I[k]) && (m_I[k] < m_rows) ) k = [0..m_size-1]( (0<=m_J[k]) && (m_J[k] < m_cols) ) k = [0..m_size-1]check_ok( m_val[k] ) Definición en la línea 141 del archivo Matrix_Sparse.h.
| void Mx::add_Matrix | ( | Matrix_Sparse< T > & | Res, |
| const Matrix_Sparse< T > & | M | ||
| ) |
Implementación por defecto para operator+( Matrix_BASE<E>&, Matrix_BASE<E> )
Matrix_BASE<E> operator+( Matrix_BASE<E>&, Matrix_BASE<E> ) .Definición en la línea 652 del archivo Matrix_Sparse.h.
1.8.0