Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Pgina 1
Clase Matriz
Clase Matriz
// Clase para matrices de nmeros en coma flotante // y doble precisin. #ifndef MATRIZ_H_ #define MATRIZ_H_ #include <valarray> class matriz { public: explicit matriz(size_t m = 1, size_t n = 1, double y = 0.0); matriz(size_t m, size_t n, double f(size_t i, size_t j)); size_t filas() const; size_t columnas() const; std::valarray<double>& operator [](size_t i); const std::valarray<double>& operator [](size_t i) const; matriz& operator +=(const matriz& a); matriz& operator -=(const matriz& a); matriz& operator *=(const matriz& a); friend matriz operator -(const matriz& a); private: size_t m, n; std::valarray<std::valarray<double> > x;
Pgina 2
Clase Matriz
}; // Prototipos de operadores externos no amigos que trabajan // con matrices. const matriz& operator +(const matriz& a); matriz operator +(const matriz& a, const matriz& b); matriz operator -(const matriz& a, const matriz& b); matriz operator *(const matriz& a, const matriz& b); // Definiciones en lnea. #include "matriz-inline.h" #endif
Pgina 3
// // // // // // Notas:
Clase Matriz
Clase Matriz
Este fichero contiene definiciones en lnea de funciones y operadores relacionados con la clase matriz y se incluye en la cabecera "matriz.h". Por lo tanto, no debe incluirse ni compilarse por separado.
// Constructores: matriz constante. inline matriz::matriz(size_t m, size_t n, double y): m(m), n(n), x(std::valarray<double>(y, n), m) {} // Dimensin. inline size_t matriz::filas() const { return m; } inline size_t matriz::columnas() const { return n; } // Operadores de ndice.
Tema 2. El paradigma de la programacin orientada a objetos
Pgina 4
Clase Matriz
inline std::valarray<double>& matriz::operator [](size_t i) { return x[i]; } inline const std::valarray<double>& matriz::operator [](size_t i) const { return x[i]; } // Operadores de auto-suma, auto-resta y auto-multiplicacin.
inline matriz& matriz::operator +=(const matriz& a) { x += a.x; return *this; } inline matriz& matriz::operator -=(const matriz& a) { x -= a.x; return *this; } inline matriz& matriz::operator *=(const matriz& a) { return *this = *this * a; }
Pgina 5
// Operadores de signo. inline const matriz& operator +(const matriz& a) { return a; } inline matriz operator -(const matriz& a) { matriz c(a); c.x = -c.x; return c; } // Operadores de suma y resta. inline matriz operator +(const matriz& a, const matriz& b) { return matriz(a) += b; } inline matriz operator -(const matriz& a, const matriz& b) { return matriz(a) -= b; }
Clase Matriz
Pgina 6
#include "matriz.h" // Constructor: matriz definida por una funcin de posicin. matriz::matriz(size_t m, size_t n, double f(size_t i, size_t j)) : m(m), n(n), x(std::valarray<double>(n), m) { for (size_t i = 0; i < m; ++i) for (size_t j = 0; j < n; ++j) x[i][j] = f(i, j); } // Operador de multiplicacin. matriz operator *(const matriz& a, const matriz& b) { matriz c(a.filas(), b.columnas()); // Matriz nula. for (size_t i = 0; i < a.filas(); ++i) for (size_t j = 0; j < b.columnas(); ++j) for (size_t k = 0; k < a.columnas(); ++k) c[i][j] += a[i][k] * b[k][j]; return c; }
Pgina 7
#include <iostream> #include "matriz.h" using namespace std;
Ejemplo de prueba
Ejemplo de prueba
// Insercin de una matriz en un flujo de salida. ostream& operator <<(ostream& fs, matriz& a) { for (size_t i = 0; i < a.filas(); ++i) { for (size_t j = 0; j < a.columnas(); ++j) fs << a[i][j] << ; fs << endl; } return fs; } // Funcin delta de Kronecker. inline double delta(size_t i, size_t j) { return i == j; }
Tema 2. El paradigma de la programacin orientada a objetos
Pgina 8
Ejemplo de prueba
// Prueba. int main() { matriz a(3, 3); matriz b(3, 3, 2.0); matriz c(3, 3, delta); a = c; cout << "A =\n" << a << b += -a; cout << "B =\n" << b << c *= c += c; cout << "C =\n" << c << matriz d(a + b * c); cout << "A + B * C =\n" }
// Matriz nula de 3 x 3. // Matriz de 3 x 3 con todos // sus elementos a 2. // Matriz identidad de 3 x 3. endl; endl; endl; << d << endl;