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;
    }
   
}

 

Matrix en C++

Aquí tenéis el código:

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std;



int main(int argc, char* argv[])
{
    int a;
    srand(time(NULL));    
    // Inicialización de la tabla de caracteres seleccionables.
    char arr[64]={'A','0','B','C','3','D','E','7','F','G','H',' ','I','J','5','K',
                  '6','L','M','N','O','P','Q','!','R','S','T','U','V','W','X','Y',
                  ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Z','1','2','4','6','8',
                  '9',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', '};
    system("color 0A"); // Consola en verde.
    while (1)
    {
          Sleep(50);
          char pline[40];
          for(int i=0; i<39; i++)
          {
             a=rand()%64; // Selecciona un char aleatorio
             if (pline[i] != ' ') {   
                cout<<arr[a]<<" "; // Se imprime
             } else {
                cout<<" "<<" ";
             }
             pline[i] = arr[a];
          }
          cout<<endl;
    }
    system("pause");
    return 0;
}


Y aquí el resultado: