Libmatthread: Mi nueva librería y locura matemático-matricial en C

Hola,

Como ya prometí hace unos días, vengo a presentaros lo último que estoy haciendo. En lugar de leeros esta entrada podéis leeros el código fuente directamente pero creo que se merece una mínima explicación todo esto porque está demasiado verde como para que se pueda sacar algo del código.

Llevaba tiempo buscando una cosa que programar, algo que me gustase y que me ayudase a trabajar en cosas en las que no había trabajado aún. Busqué y al final decidí empezar una cosa yo mismo. Tal y como explico en esta entrada.

La idea del proyecto es hacer una librería para el uso de matrices y señales/funciones/vectores en C. Uso C porque quiero profundizar un poco en su manejo y porque quiero que la librería vaya como un tiro. El objetivo es hacer que paralelice trabajo para ir más rápido aunque aún no he llegado a esa parte (estoy con los básicos todavía). El fin principal es que sea lo más rápida posible, me da igual que no sea del todo eficiente, aunque intentaré que lo sea al máximo, lo que quiero es que si tengo que convolucionar dos señales gigantes o resolver un sistema de ecuaciones lineales enorme lo haga lo más rápido que pueda.

Otra cosa que es superimportante para mí es que no usa librerías externas. No tiene dependencias. Más abajo enseño una lista de lo que uso.

Cosas que tengo pensadas como ideas para el futuro son implementarle una pequeña consola para poder meterle las ordenes en vivo, pero eso ya… no cumple el objetivo principal y seguramente tendría que hacerlo en algo que parsee texto mejor, como perl o python, pero no me lío todavía. Primero lo primero.

¿Por qué hago todo esto si ya hay miles de herramientas y programas maduros que lo hacen bastante mejor de lo que yo voy a conseguir? Porque es divertido y me gustan las matemáticas y porque quiero aprender cosas. Además, puede que le sea útil a alguien aunque sea de refilón.

Ahora nos metemos en lo técnico. Estoy usando las siguientes cosas para jugar, hago una lista y digo para qué las uso y dónde las podéis ver:

  • Doxygen: Algunos comentarios del código fuente están hechos de forma especial para que ésta herramienta pueda hacer su trabajo. No es necesaria para usar ni compilar la librería, pero permite crear manuales de forma sencilla. Podéis ver este tipo de comentarios en los archivos .h de libmatthread, y podéis ver el archivo de configuración que uso en la carpeta raíz del proyecto, se llama Doxyfile. Hablé de esto hace tiempo aquí.
  • GNU-Make: Esta herramienta la uso para compilar todo el proyecto. Hasta ahora no había escrito makefiles yo mismo excepto en un par de ocasiones porque utilizaba herramientas que te los construían, como CMake por ejemplo. En este caso, como el proyecto es relativamente sencillo he escrito yo el makefile (no os fiéis de que esté bien). Hablo de esta herramienta aquí.

El resto solamente es C.

Bien, para que veáis un poco la filosofía de lo que estoy haciendo. Las matrices que tengo definidas no son arrays bidimensionales, son unidimensionales y emulan un array bidimensional con unas macros. La idea no es mía, la copié de un proyecto que me encontré en gitHub y me pareció interesante jugar con ella. Aquí veis como lo hacen ellos. Es interesante porque te permite recorrer toda la matriz con un sólo bucle for, si quieres. (ojo, su matriz es de integers, las mías son de long doubles)

//A macro to emulate a 2d array. Works just like matrix[row][col].
#define PMATRIX(matrix, row, col) matrix->array[row + col * matrix->height]
#define MATRIX(matrix, row, col) matrix.array[row + col * matrix.height]

//Structures
//Matrix structure
typedef struct {
	unsigned int height;
	unsigned int width;
	int *array;
} matrix_t;

Ahora un poco la estructura del proyecto:

Lo gordo del código está en la carpeta libmatthread porque es allí donde está el código de la librería en sí. Dentro de esta carpeta tenéis varios archivos. El common es para todas las funciones que serán genéricas para los posibles usos de la estructura matrix_t, ya sea como matriz o como señal (todo lo básico). El archivo signals es un conjunto de funciones para cuando matrix_t sea utilizada como una señal, es decir: convoluciones, correlaciones, etc. (cosas que sólo tienen un sentido matemático en señales). El archivo octaveIO es para escribir y leer archivos .mat de octave/matlab. Aparecerá inminentemente también el archivo matrices que contendrá funciones que sólo tienen un sentido cuando se trabaja con matrices.

En la carpeta src, aunque ahora mismo no hay más que un main que no hace nada, habrá código para binarios predefinidos (todavía por determinar) y para lo que he dicho antes del intérprete de comandos ese que se me ha ocurrido.

En la carpeta tests hay unos tests que voy haciendo para probar el código. Los commiteo porque son interesantes para la gente que se lea el proyecto, yo creo.

La carpeta testfiles tiene matrices de pruebas, guardadas en archivos .mat de octave.

Para terminar. Si queréis ver de qué va todo esto, igual lo veis más claro si ejecutáis el Doxygen y leéis la documentación que genera, que me la estoy currando para que sea sencillito de leer, ya que es una librería. Para hacerlo basta con ejecutar lo siguiente en la carpeta raíz del proyecto (tenéis que tener doxygen instalado, eso sí):

$ doxygen Doxyfile

Esto generará una carpeta llamada docs y allí dentro podréis ver la documentación en HTML (entrando en index.html) o generar un .pdf utilizando latex (haciendo un make en la carpeta de latex) o incluso ver unas man-pages.

De momento doy por terminada la intro con esto. Espero vuestros comentarios, contribuciones, amenazas, quejas y esas cosas.

Durante las próximas semanas trataré de explicar como funcionan diferentes partes de esto y tendré bastante para publicar por aquí.

También agradecerle a mi hermana, experta en análisis numérico, las contribuciones matemáticas al proyecto.

Y eso es todo por hoy.

Good night.

Anuncios

Un pensamiento en “Libmatthread: Mi nueva librería y locura matemático-matricial en C

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

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