lunes, 23 de abril de 2012

Matrices con Boost

La librería Boost es un conjunto de bibliotecas de software libre preparadas para extender las capacidades del lenguaje de programación C++. Es decir que es una extensión de las librerías STL que incluye C++ estándar en la que entre otras cosas podemos encontrar una extensión que nos permite trabajar con matrices y operar con ellas tal y como veremos a continuación.

Instalación

Para instalar Boost en vuestro sistema os recomiendo que sigáis la guía oficial para vuestro sistema operativo (Linux, Windows). Existen versiones pre-compiladas y dependiendo del vuestra de distribución Linux en ocasiones Boost viene pre-instalado directamente. Por otro lado si trabajáis en Windows con Visual Studio podeis bajaros la versión binaria que proporciona BoostPro con la librería pre-compilada para cada una de las versiones de Visual Studio. 

Matrices

Y ahora vamos al grano. La clase template matrix nos permite trabajar de una forma fácil con matrices de cualquier tipo y realizar sobre ellas operaciones simples (sumas, restas, etc.) . En el siguiente ejemplo en primer lugar se importa la clase, después se definen los namespaces en los que se trabaja y finalmente se muestra el un código que realiza la carda de una matriz, una serie de operaciones y vuelve a mostrar los resultados:

// includes
#include <boost/numeric/ublas/matrix.hpp>
#include <iostream>
// seleccion namespaces
using namespace std;
using namespace boost::numeric::ublas;

int main(int argc, char* argv[]) {
    matrix<int> mt (3, 3);   
    cout << "Generacion de la matriz: " << endl;
    for (unsigned r=0; r < mt.size1(); r++) {
        for (unsigned c=0; c < mt.size2(); c++) {
            mt(r,c) = r+c;
            cout << mt(r,c) << " ";
        }
        cout << endl;
    }
    cout << "Operaciones con la matrix y resultados: " << endl;
    mt = mt + mt;    // operacion entre matrices
    mt = mt * 4;        // matriz y escalar.
    mt = mt / 2;
    mt = mt - mt;
    // Impresion resultados
    for (unsigned r=0; r < mt.size1(); r++) {
        for (unsigned c=0; c < mt.size2(); c++) {
            cout << mt(r,c) << " ";
        }
        cout << endl;
    }
   
}

 

No hay comentarios:

Publicar un comentario