lunes, 1 de febrero de 2016

Libreria Armadillo para Linux (álgebra lineal C++)

Hola a todos. Esta vez vamos a hablar de la librería Armadillo para C++.
Esta librería permite ejecutar cálculos matriciales de una forma muy sencilla. Para utilizarla, deberéis instalar algunas librerías extra. A continuación tenéis la manera de instalar todas las librerias necesarias (incluída la de Armadillo) para poder utilizar posteriormente en proyectos en el lenguaje C++

Lo único que debemos hacer es abrir el terminal de Linux (yo lo he hecho en Linux Mint), y ejecutamos la siguiente instrucción:

 sudo apt-get install liblapack-dev libblas-dev libboost-dev libarmadillo-dev


Una vez instalado, ya podréis importarla por ejemplo a proyectos de Eclipse.


Ahora vamos a ver cómo se puede hacer esto en Eclipse.

1- Hacemos clic derecho en el nombre del proyecto y en Properties. Buscamos la opción C/C++ Build y en Settings. Seleccionamos la opción Includes de GCC C++ Compiler.


2-A continuación añadiremos un fichero que contiene la librería de Armadillo. Para ello, en el apartado "Include files (-include)" [parte de abajo], hacemos clic en el icono de añadir fichero y tecleamos la siguiente ruta:
/usr/include/armadillo




2.5- Algunos usuarios comentan que han necesitado un paso extra. Añadir armadillo en GCC C++ Linker en la pestaña Libraries. Es posible que dependa de la versión de Linux o de la librería armadillo, así que lo añado aquí por si hay mas casos en los que con el resto de pasos no es suficiente. ¡Gracias por vuestra aportación!


3- Por último hacemos clic en Apply y OK. Ya podemos probar a incluir la librería de Armadillo en nuestro código y compilar nuestro programa para confirmar que se ha indexado correctamente.




Esta librería tiene muchas funciones interesantes. Podéis obtener más información en la web oficial.

¡Hasta la próxima!

10 comentarios:

  1. Corregir es /usr/include/armadillo

    ResponderEliminar
    Respuestas
    1. Cierto. Se me había escapado una 's' en la ruta de la librería. Ya está corregido. Muchas gracias

      Eliminar
  2. A pesar que segui los pasos no me reconoce la libreria arma, inclui esto /usr/include/armadillo_bits pero aun sigo teniendo inconvenientes al compilar

    make all
    Building file: ../src/Prueba.cpp
    Invoking: GCC C++ Compiler
    g++ -include/usr/include/armadillo -include/usr/include/armadillo_bits -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Prueba.d" -MT"src/Prueba.d" -o "src/Prueba.o" "../src/Prueba.cpp"
    cc1plus: fatal error: /usr/include/armadillo_bits: No existe el archivo o el directorio
    compilation terminated.
    src/subdir.mk:18: recipe for target 'src/Prueba.o' failed
    make: *** [src/Prueba.o] Error 1

    Sabes alguna solucion?

    ResponderEliminar
    Respuestas
    1. Por lo que he leído, según la versión de Linux que tengas, los archivos de Armadillo estarán en /usr/include/armadillo o en /usr/include/armadillo_bits. No tendrás los dos directorios a la vez.

      El error dice que el directorio /usr/include/armadillo_bits no existe en tu máquina, así que, si se te instaló sin errores la librería, debería encontrarse en /usr/include/armadillo.

      Por tanto, armadillo_bits quítalo.

      Se me ocurre que podrías abrir un terminal y escribir este comando:

      "whereis armadillo"

      Con ese comando deberías conseguir la ruta en la que se te ha instalado la librería, y por tanto la que deberías poner en Eclipse. Si no te devuelve nada ese comando es porque no está instalado, quizás por algún error al intentar instalarlo.

      Ojalá te sea de ayuda. Si sigues teniendo problemas, no tengas dudas en comentarlo, ayudaremos en lo que podamos ;)

      Eliminar
  3. Revise eso y deje solo la libreria armadillo y elimine del include /usr/include/armadillo_bits, lo agregue dado que me salia este error:

    Building target: Prueba
    Invoking: GCC C++ Linker
    g++ -o "Prueba" ./src/Prueba1.o
    ./src/Prueba1.o: En la función `void arma::lapack::gesv(int*, int*, double*, int*, int*, double*, int*, int*)':
    /usr/include/armadillo_bits/lapack_wrapper.hpp:643: referencia a `wrapper_dgesv_' sin definir
    ./src/Prueba1.o: En la función `void arma::lapack::gels(char*, int*, int*, int*, double*, int*, double*, int*, double*, int*, int*)':
    /usr/include/armadillo_bits/lapack_wrapper.hpp:677: referencia a `wrapper_dgels_' sin definir
    /usr/include/armadillo_bits/lapack_wrapper.hpp:677: referencia a `wrapper_dgels_' sin definir
    collect2: error: ld returned 1 exit status
    make: *** [Prueba] Error 1
    makefile:45: recipe for target 'Prueba' failed

    16:17:19 Build Finished (took 16s.942ms)


    El problema esta en la siguiente linea de codigo:

    std::cout << solve(A,b) << '\n';

    donde A es una matriz y b es un vector.

    No reconoce la funcion solve(), pero cuando corro el codigo en consola funciona correctamente, pero no en eclipse no compila. Sera que sabes resolver ese error?

    ResponderEliminar
    Respuestas
    1. Ya lo resolvi creo que falta un paso, es agregar armadillo a GCC C++ Linker en la pestaña Libraries :) Muchas gracias por todo

      Eliminar
    2. Muchas gracias por compartir tu solución. Curiosamente en mi PC no fue necesario ese paso extra. Quizás sea por la versión de Linux (yo uso Linux Mint 17.3), aunque no puedo asegurar que esa sea la razón.

      Eliminar
    3. Jormar Turizo, estoy corriendo un programa en eclipse con armadillo y no me corre pero sí en la terminal. Agregué la /usr/include/armadillo_bits al linker de c++.
      ¿¿ Hiciste algo más para que te corriera ??
      de antemano, gracias.

      Eliminar
    4. La respuesta era agregar la palabra "armadillo" en el linker libraries (-l), sin las comillas.

      Eliminar
    5. Es curioso, no sé en qué casos es necesario añadir lo que decís. Lo he instalado un par de veces y en ningún caso tuve que añadir "armadillo" al linker. Quizás tiene que ver con alguna variable de entorno que en las últimas versiones de la librería se configure automáticamente.. Misterios de la informática

      Eliminar