Multiplicación de matrices con Lapack++

Aunque el algoritmo para la multiplicación de matrices no es muy complejo, vamos a usar la librería estándar de álgebra lineal, Lapack++, para ilustrar este tipo de operaciones en un ejemplo previo de cálculo de autovalores y autovectores de una matriz simétrica con elementos reales. En este caso, una vez calculados los autovalores y sus autovectores, la recomposición de la matriz original se logra multiplicando la matriz de autovectores por la matriz diagonal de autovalores y este resultado, a su vez, se multiplica por la matriz transpuesta de autovectores.

Para realizar estos cálculos hay que añadir una nueva cabecera, <blas3pp.h>, para acceder a la función Blas_Mat_Mat_Mult. Por otra parte, como también se requiere transformar el arreglo de autovalores, que es de la clase Vector, en una matriz diagonal, también se ilustra este hecho mediante el empleo de la función from_diag. La sintáxis para el uso del código se tomó de las siguientes referencias (documentación de Lapack++):

from_diag

Blas_Mat_Mat_Mult()

El programa, comentado en lo posible, fue el siguiente:

#include <iostream>
#include <cstdio>
#include <lapackpp/laslv.h>
#include <lapackpp/blas3pp.h>

using namespace std;

int main(){

double a[]={ 1.0,  2.0,  3.0,
             2.0,  1.0,  4.0,
             3.0,  4.0,  1.0};

	LaVectorDouble v(3), c(3); // Declara objetos de la Clase Vector

	LaGenMatDouble A(a,3,3), C(3,3), Z(3,3), W(3,3); // Declara objetos de la Clase Matriz

	cout<<"La matriz original es:\n";
	
	cout << A;
	
	LaEigSolve(A, c, v, C);  // C es la matriz de autovectores 

	cout<<"\nLos autovectores son:\n";

	cout << C;

	cout << "\nLos autovalores son:\n";

	cout << c;  // c es el arreglo de autovalores reales

	cout << "\nLos autovalores dispuestos como una matriz diagonal:\n";
	
	LaGenMatDouble B(LaGenMatDouble::from_diag(c));  // Transforma un vector en una matriz diagonal 
		
	cout << B;

	Blas_Mat_Mat_Mult(C, B, Z);  //Multiplica (matriz de autovectores x matriz de autovalores) = Z

	Blas_Mat_Mat_Mult(Z, C, W,false,true);  // Multiplica Z x transpuesta de la matriz de autovectores = matriz original = W = A

	cout << "\nRecomponiendo la matriz original:\n";

	cout << W;

	return 0;

}

Se grabó como mutmalt.c++ y se compiló y ejecutó con:

g++ multmat.c++ -o multmat -llapackpp
./multmat

cuya salida fue la siguiente:

La matriz original es:
1  2  3
2  1  4
3  4  1

Los autovectores son:
0.505785  0.824038  -0.255232
0.584374  -0.544925  -0.601302
0.634577  -0.154979  0.757161

Los autovalores son:
7.07467
-0.886791
-3.18788

Los autovalores dispuestos como una matriz diagonal:
7.07467  0  0
0  -0.886791  0
0  0  -3.18788

Recomponiendo la matriz original:
1  2  3
2  1  4
3  4  1
Esta entrada fue publicada en Código C++ y etiquetada , . Guarda el enlace permanente.

2 respuestas a Multiplicación de matrices con Lapack++

  1. Pingback: Autovalores y autovectores: Rotación de Jacobi |

  2. Pingback: Análisis de Componentes Principales en Teledetección: Autovalores y autovectores |

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