Advertisement
Guest User

Clase Matriz con template

a guest
Oct 3rd, 2011
1,153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.56 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. #include <iomanip>
  6. #include <cstdlib>
  7. #include <cassert>
  8.  
  9. template<typename T> class Matriz;
  10. template<typename T> ostream& operator << (ostream &salida, Matriz<T> &z);
  11. template<typename T> istream& operator >> (istream &entrada, Matriz<T> &z);
  12.  
  13. template<typename T> Matriz<T> operator + (Matriz<T> x, Matriz<T> y);
  14. template<typename T> Matriz<T> operator - (Matriz<T> x, Matriz<T> y);
  15. template<typename T> Matriz<T> operator * (Matriz<T> x, Matriz<T> y);
  16. template<typename T> Matriz<T> operator * (T x, Matriz<T> y);
  17.  
  18. template <class T>
  19.  
  20. class Matriz {
  21.  
  22. private:
  23.  
  24.     T **a;
  25.     int rows, cols;
  26.  
  27. public:
  28.  
  29.     Matriz(int m, int n);
  30.     ~Matriz();  // Destructor de la clase
  31.  
  32.     void initMatriz(T **x);
  33.     void inverMat(T **a);
  34.    
  35.     T deterMat();
  36.  
  37.     friend ostream& operator << <> (ostream &salida, Matriz<T> &z); //sobrecarga del operador <<
  38.     friend istream& operator >> <> (istream &entrada, Matriz<T> &z); //sobrecarga del operador >>
  39.  
  40.     friend Matriz   operator  + <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador + para sumar matrices
  41.     friend Matriz   operator  - <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador - para sumar matrices
  42.     friend Matriz   operator  * <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador * para multiplicar matrices
  43.     friend Matriz   operator  * <> (T x, Matriz<T> y); //sobrecarga al operador * para multiplicar escalar*matriz
  44.  
  45.  
  46. };
  47.  
  48. //Constructor por parametros
  49.  
  50. template<typename T>
  51.  
  52. Matriz<T>::Matriz(int m , int n){
  53.  
  54.     int i;
  55.  
  56.     rows = m;
  57.  
  58.     cols = n;
  59.  
  60.     a = new T*[rows];
  61.  
  62.     for(i = 0; i< rows; i++){
  63.  
  64.         a[i] = new T[cols];
  65.  
  66.     }
  67.  
  68. }
  69.  
  70. template <typename T>
  71.  
  72. Matriz<T>::~Matriz() {}
  73.  
  74. template<typename T>
  75.  
  76. void Matriz<T>::initMatriz(T **x){
  77.  
  78.     int i,j;
  79.  
  80.     for(i=0; i < rows; i++){
  81.  
  82.             for(j=0; j < cols; j++){
  83.  
  84.                 a[i][j] = x[i][j];
  85.        
  86.         }
  87.     }
  88.    
  89.  
  90. }
  91.  
  92. template<typename T>
  93.  
  94. istream &operator >> (istream &entrada, Matriz<T> &z){//sobrecarga del operador >>
  95.  
  96.     cout << "\nIntroduzca los valores a traves del teclado:\n\n";
  97.  
  98.     int i, j;
  99.  
  100.     for (i = 0; i < z.rows; i++) {
  101.  
  102.         for (j = 0; j < z.cols; j++) {
  103.  
  104.             cout << "A[" << i+1 <<"][" << j+1 << "] = ? ";
  105.  
  106.             entrada >> z.a[i][j];
  107.  
  108.         }
  109.      
  110.     }
  111.      
  112.     return entrada;
  113.  
  114. }
  115.  
  116. template<typename T>
  117.  
  118. ostream &operator << (ostream &salida, Matriz<T> &z){//sobrecarga del operador <<
  119.  
  120.     salida.setf(ios::fixed);
  121.     salida.precision(4);   
  122.  
  123.     int i, j;
  124.  
  125.     for (i = 0; i < z.rows; i++) {
  126.  
  127.         for (j = 0; j < z.cols; j++) {
  128.  
  129.             salida << setw(10) << z.a[i][j];
  130.  
  131.         }
  132.  
  133.         salida << "\n";
  134.      
  135.     }
  136.      
  137.     return salida;
  138.  
  139. }
  140.  
  141. template<typename T>
  142.  
  143. Matriz<T> operator +(Matriz<T> x, Matriz<T> y){//sobrecarga al operador + para sumar matrices
  144.  
  145.     assert(x.rows == y.rows || x.cols == y.cols);
  146.  
  147.     Matriz<T> sum_mat(x.rows, x.cols);
  148.  
  149.     int i,j;
  150.  
  151.     for(i=0; i < x.rows; i++){
  152.  
  153.         for(j=0; j < x.cols; j++){
  154.  
  155.             sum_mat.a[i][j] = x.a[i][j] + y.a[i][j];
  156.        
  157.         }
  158.     }
  159.    
  160.     return sum_mat;
  161.  
  162. }
  163.  
  164. template<typename T>
  165.  
  166. Matriz<T> operator -(Matriz<T> x, Matriz<T> y){//sobrecarga al operador + para restar matrices
  167.  
  168.     assert(x.rows == y.rows || x.cols == y.cols);
  169.  
  170.     Matriz<T> rest_mat(x.rows, x.cols);
  171.  
  172.     int i,j;
  173.  
  174.     for(i=0; i < x.rows; i++){
  175.  
  176.         for(j=0; j < x.cols; j++){
  177.  
  178.             rest_mat.a[i][j] = x.a[i][j] + y.a[i][j];
  179.        
  180.         }
  181.     }
  182.    
  183.     return rest_mat;
  184.  
  185. }
  186.  
  187. template<typename T>
  188.  
  189. Matriz<T> operator *(Matriz<T> x, Matriz<T> y){//sobrecarga al operador * para multiplicar matrices
  190.  
  191.     assert(x.cols == y.rows);
  192.  
  193.     Matriz<T> mult_mat(x.rows, y.cols);
  194.  
  195.     int i,j,k;
  196.  
  197.     for(i=0; i < x.rows; i++){
  198.  
  199.         for(j=0; j < x.cols; j++){
  200.  
  201.             mult_mat.a[i][j] = 0;
  202.  
  203.             for(k=0; k < x.cols; k++){
  204.  
  205.                 mult_mat.a[i][j] += x.a[i][k] * y.a[k][j];
  206.            
  207.             }
  208.        
  209.         }
  210.     }
  211.    
  212.     return mult_mat;
  213.  
  214. }
  215.  
  216. template<typename T>
  217.  
  218. Matriz<T> operator *(T x, Matriz<T> y){//sobrecarga al operador * para multiplicar escalar*matriz
  219.  
  220.     Matriz<T> esc_mat(y.rows, y.cols);
  221.  
  222.     int i,j;
  223.  
  224.     for(i=0; i < y.rows; i++){
  225.  
  226.         for(j=0; j < y.cols; j++){
  227.  
  228.             esc_mat.a[i][j] = x*y.a[i][j];
  229.        
  230.         }
  231.     }
  232.    
  233.     return esc_mat;
  234.  
  235. }
  236.  
  237. template<typename T>
  238.  
  239. void Matriz<T>::inverMat(T **z) {
  240.  
  241. // Algoritmo para la eliminación simple de Gauss
  242.  
  243.     int i, j, k, n= rows, m = cols;
  244.  
  245.     assert (rows == cols);
  246.  
  247.     double factor;
  248.  
  249.     double **L, **ainv, *D, *X;
  250.    
  251.     X = new double [n]; D = new double [n];
  252.  
  253.     L = new double* [n];    ainv = new double* [n];
  254.    
  255.     for (j = 0; j < n; j++) {
  256.  
  257.         L[j] = new double [n]; ainv[j] = new double [n];
  258.  
  259.     }
  260.  
  261.     for (k = 0; k < n - 1; k++) {
  262.        
  263.         for (i = k+1; i < n;  i++) {
  264.  
  265.             factor = z[i][k]/z[k][k];
  266.  
  267.             for (j = k+1; j < n + 1; j++) {
  268.  
  269.                 z[i][j] = z[i][j] - factor * z[k][j];
  270.  
  271.             }
  272.        
  273.  
  274.  
  275.         }
  276.  
  277.     }
  278.  
  279. // Cálculo del determinante
  280.        
  281.         double determ;
  282.  
  283.         determ = 1.;
  284.  
  285.     for (i = 0; i < n; i++) {
  286.  
  287.         determ = determ * z[i][i];
  288.  
  289.     }
  290.  
  291.     assert(determ != 0);
  292.  
  293. // Rutina para determinar las matrices L (inferior) y U (superior) de la
  294. // descomposición LU
  295.  
  296.  
  297.         for (i = 0; i < n; i++) {
  298.  
  299.                for (j = 0; j < n; j++) {
  300.  
  301.                   if (i > j) {
  302.      
  303.                       L[i][j] = z[i][j]/z[j][j];
  304.  
  305.                       z[i][j] = 0;
  306.  
  307.                    }
  308.  
  309.  
  310.                }
  311.  
  312.         }
  313.  
  314.  
  315.        for (i = 0; i < n; i++) {
  316.  
  317.             for (j = 0; j < n; j++) {
  318.  
  319.                   L[j][j] = 1;
  320.  
  321.             }
  322.  
  323.         }
  324.  
  325.  
  326. // Implementación de la rutina para el cálculo de la inversa
  327.  
  328.  
  329.  for (k = 0; k < n; k++) {
  330.  
  331.  
  332. // Esta rutina inicializa los L[i][n] para ser utilizados con la matriz L
  333.  
  334.  
  335.           for (i = 0; i < n; i++) {
  336.  
  337.                if (i == k) L[i][n] = 1;
  338.  
  339.                else  L[i][n] = 0;
  340.  
  341.            }
  342.  
  343. // Esta función implementa la sustitución hacia adelante con la matriz L y los L[i][n]
  344. // que produce la rutina anterior
  345.  
  346.   double sum;
  347.  
  348.   D[0] = L[0][n];
  349.  
  350.   for (i = 1; i < n; i++) {
  351.  
  352.        sum = 0;
  353.  
  354.        for (j = 0; j < i; j++) {
  355.  
  356.             sum = sum + L[i][j]*D[j];
  357.  
  358.        }
  359.  
  360.         D[i] = L[i][n] - sum;
  361.  
  362.    }
  363.  
  364.  
  365.  
  366. // Esta rutina asigna los D[i] que produce forward para ser utilizados con la matriz U
  367.  
  368.   for (i = 0; i < n; i++) {
  369.  
  370.           z[i][n] = D[i];
  371.  
  372.   }
  373.  
  374. // Rutina que aplica la sustitución hacia atras
  375.  
  376.  
  377.  X[n-1] = z[n-1][n]/z[n-1][n-1];
  378.  
  379.  // Determinación de las raíces restantes
  380.  
  381.  
  382.   for (i = n - 2; i > -1; i--) {
  383.  
  384.         sum = 0;
  385.  
  386.         for (j = i+1; j < n; j++) {
  387.  
  388.               sum = sum + z[i][j]*X[j];
  389.  
  390.          }
  391.  
  392.          X[i] = (z[i][n] - sum)/z[i][i];
  393.  
  394.    }
  395.  
  396.  
  397. // Esta rutina asigna los X[i] que produce Sustituir como los elementos de la matriz inversa
  398.  
  399.   for (i = 0; i < n; i++) {
  400.  
  401.          ainv[i][k] = X[i];
  402.  
  403.   }
  404.  
  405.  }   // llave de cierre del for para k
  406.  
  407.     for(i=0; i < n; i++){
  408.  
  409.             for(j=0; j < n; j++){
  410.  
  411.                 a[i][j] = ainv[i][j];
  412.        
  413.         }
  414.     }
  415.  
  416.     delete L, D, X, ainv;
  417.  
  418. }
  419.  
  420. template<typename T>
  421.  
  422. T Matriz<T>::deterMat() {
  423.  
  424. // Algoritmo para la eliminación simple de Gauss
  425.  
  426.     int i, j, k, n=rows, m=cols;
  427.  
  428.     assert (rows == cols);
  429.  
  430.     double **b;
  431.  
  432.     b = new double* [n];
  433.  
  434.     for(j=0; j<n; j++){
  435.  
  436.         b[j] = new double [n];
  437.    
  438.     }  
  439.  
  440.     for(i=0; i<n; i++){
  441.  
  442.         for(j=0; j<n; j++){
  443.  
  444.             b[i][j] = a[i][j];
  445.            
  446.         }
  447.  
  448.     }
  449.  
  450.     double factor;
  451.  
  452.     for (k = 0; k < n - 1; k++) {
  453.        
  454.         for (i = k+1; i < n;  i++) {
  455.  
  456.             factor = b[i][k]/b[k][k];
  457.  
  458.             for (j = k+1; j < n + 1; j++) {
  459.  
  460.                 b[i][j] = b[i][j] - factor * b[k][j];
  461.  
  462.             }
  463.        
  464.  
  465.  
  466.         }
  467.  
  468.     }
  469.  
  470. // Cálculo del determinante
  471.  
  472.     double determ = 1.;
  473.  
  474.     for (i = 0; i < n; i++) {
  475.  
  476.         determ = determ * b[i][i];
  477.  
  478.     }
  479.  
  480.  
  481.     delete [] b;
  482.  
  483.     return determ;
  484.  
  485. }
  486.  
  487.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement