Métodos Clase Matriz con plantillas (template): C/C++

En un artículo anterior comencé a implementar una Clase Matriz con plantillas. Desde ese momento hasta ahora incluí los siguientes métodos:

Sobrecarga de los operadores >> y << para introducir e imprimir objetos del tipo Matriz a través del teclado, sobrecarga de los operadores +, – y * para sumar, restar y multiplicar matrices y multiplicar un escalar por una matriz, calcular la inversa y el determinante de una matriz cuadrada. A continuación, la declaración de la Clase:

#include <iostream>

using namespace std;

#include <iomanip>
#include <cstdlib>
#include <cassert>

template<typename T> class Matriz;
template<typename T> ostream& operator << (ostream &salida, Matriz<T> &z);
template<typename T> istream& operator >> (istream &entrada, Matriz<T> &z);

template<typename T> Matriz<T> operator + (Matriz<T> x, Matriz<T> y);
template<typename T> Matriz<T> operator - (Matriz<T> x, Matriz<T> y);
template<typename T> Matriz<T> operator * (Matriz<T> x, Matriz<T> y);
template<typename T> Matriz<T> operator * (T x, Matriz<T> y);

template <class T>

class Matriz {

private:

	T **a;
	int rows, cols;

public:

	Matriz(int m, int n);
	~Matriz();  // Destructor de la clase

	void initMatriz(T **x);
	void inverMat(T **a);
	
	T deterMat();

	friend ostream& operator << <> (ostream &salida, Matriz<T> &z); //sobrecarga del operador <<
	friend istream& operator >> <> (istream &entrada, Matriz<T> &z); //sobrecarga del operador >>

	friend Matriz   operator  + <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador + para sumar matrices
	friend Matriz   operator  - <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador - para sumar matrices
	friend Matriz   operator  * <> (Matriz<T> x, Matriz<T> y); //sobrecarga al operador * para multiplicar matrices
	friend Matriz   operator  * <> (T x, Matriz<T> y); //sobrecarga al operador * para multiplicar escalar*matriz


};

Link a los procedimientos:

Matriz.h

Un programa para verificar una muestra de los métodos implementados:

#include "Matriz.h"

int main(){

	system ("clear");

	Matriz<double> a(3,3), b(3,3), c(3,3);

	int i, rows, cols;

	double **m;

	rows = 3;

	cols = 3;

	m = new double *[rows];

	for(i = 0; i< rows; i++){

		m[i] = new double [cols];

	}

	m[0][0] = 1, m[0][1] = 2, m[0][2] = 3,
	m[1][0] = 2, m[1][1] = 5, m[1][2] = 4,
	m[2][0] = 3, m[2][1] = 4, m[2][2] = 9;

	a.initMatriz(m); b.initMatriz(m);

	cout << "Imprime el objeto a:\n\n" << a;

	double determinante;

	determinante = a.deterMat();

	cout << "\nEl determinante de a es = " << determinante << "\n";

	cout << "\nImprime el objeto b:\n\n" << b;

	c = a+b;

	cout << "\nImprime la suma de a+b (c):\n\n" << c;

	c = a*b;

	cout << "\nImprime la multiplicacion de a*b (c):\n\n" << c;

//	cin >> c;

	b.inverMat(m);

	cout << "\nImprime la inversa de a:\n\n" << b;

	c = a*b;

	cout << "\nImprime la matriz identidad:\n\n" << c;

	delete [] m;

	return 0;

}

La salida a través de la cónsola:

zeito@Debian:~/Desktop/MATRIZ$ ./main
Imprime el objeto a:

    1.0000    2.0000    3.0000
    2.0000    5.0000    4.0000
    3.0000    4.0000    9.0000

El determinante de a es = -4.0000

Imprime el objeto b:

    1.0000    2.0000    3.0000
    2.0000    5.0000    4.0000
    3.0000    4.0000    9.0000

Imprime la suma de a+b (c):

    2.0000    4.0000    6.0000
    4.0000   10.0000    8.0000
    6.0000    8.0000   18.0000

Imprime la multiplicacion de a*b (c):

   14.0000   24.0000   38.0000
   24.0000   45.0000   62.0000
   38.0000   62.0000  106.0000

Imprime la inversa de a:

   -7.2500    1.5000    1.7500
    1.5000    0.0000   -0.5000
    1.7500   -0.5000   -0.2500

Imprime la matriz identidad:

    1.0000    0.0000    0.0000
    0.0000    1.0000    0.0000
    0.0000    0.0000    1.0000
zeito@Debian:~/Desktop/MATRIZ$

La matriz identidad (objeto c) es el producto de la multiplicación de la matriz a (objeto a) por su inversa (objeto b).

Esta entrada fue publicada en Código C++. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s