Autovalores y Autovectores en Clase Matriz con plantillas (template): C/C++

Con esta nueva versión de la Clase Matriz con plantillas, se añade la posibilidad de calcular los autovectores y autovalores de una matriz cuadrada real simétrica. En el último caso, el arreglo simple de autovalores se incluye directamente como una matriz diagonal para facilitar la recomposición de la matriz original. Por tanto, también se incluye el método que permite determinar la transpuesta de una matriz.

Esta es la nueva declaración de la Clase:

#include <iostream>

using namespace std;

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

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);
	void autovecMat(T **a);
	void autovalMat(T **a);
	void transpMat(Matriz<T> x);
	
	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


};

Este es el link a los procedimientos donde se han corregido algunos bugs:

Matriz.h

A continuación, el programa principal donde se incluyen los nuevos métodos desarrollados; algunos comentados:

#include "Matriz.h"

#include <cmath>

int main(){

	system ("clear");

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

	int i, j, 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;

	a.autovecMat(m); // Matriz de autovectores de a

	cout << "\nImprime la matriz de autovectores de a:\n\n" << a;

	b.autovalMat(m); // Matriz de autovalores de a (matriz diagonal)

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

	c.transpMat(a);  // Transpuesta de A

	cout << "\nImprime la matriz transpuesta de autovectores de a:\n\n" << c;

	e = a*b*c; // Reconstruye la matriz original (matriz de autovectores de a por
			   // matriz de autovalores de a por transpuesta de matriz de autovectores de a

	cout << "\nImprime la matriz original:\n\n" << e;

	delete [] m;

	return 0;

}

La salida del programa anterior:

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

Imprime la matriz de autovectores de a:

    0.9540    0.0415    0.2969
   -0.1938    0.8410    0.5051
   -0.2287   -0.5394    0.8104

Imprime la matriz de autovalores de a:

   -0.1254    0.0000    0.0000
    0.0000    2.5330    0.0000
    0.0000    0.0000   12.5924

Imprime la matriz transpuesta de autovectores de a:

    0.9540   -0.1938   -0.2287
    0.0415    0.8410   -0.5394
    0.2969    0.5051    0.8104

Imprime la matriz original:

    1.0000    2.0000    3.0000
    2.0000    5.0000    4.0000
    3.0000    4.0000    9.0000
zeito@Debian:~/Desktop/MATRIZ$ 
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