
Hola chiquillos y chiquillas, en este post más que mostrarles un tutorial quiero contarles la experiencia que tuve utilizando el programa de cálculos numéricos GNU/Octave y un programa de hojas de cálculo, en este caso Libreoffice Calc, para un trabajo que tenía.
Bien, me saltaré la parte de la explicación de que son o lo que hacen esos programas para mostrarles que es lo que tenía que hacer y como lo hice, además hay muchos post y temas que explican eso.
Para mi trabajo de tesis tenía que representar unas tablas en gráficas tridimensionales, estas gráficas se denominan mapas de inyección y de encendido. ( para quien quiera saber más )
El mapa que debía obtener era algo como esto:

Ya tenía las tablas realizadas en Calc, así que lo primero que se me vino a la mente fue crear los mapas en la misma hoja de cálculo. ¡Oh sorpresa!, el programa no tiene superficies en las opciones de gráficos, pude haber utilizado la opción Área 3D, pero dada la cantidad de datos el cpu se ponía al 100% demorándose media eternidad en dibujar otra vez si cambiaba un dato y la gráfica parecía una escalinata de colores:

Entonces me viene la idea de que Octave puede hacer las gráficas que quiero, ya lo había utilizado antes para hacer curvas en 2D y sabía que tenía la opción de dibujar superficies. Pero sale un problema, tengo una matriz de 41x41, lo que significaría transcribir 1681 datos más los 82 de los ejes, así que me hago la pregunta, ¿se pueden importar datos de las hojas de cálculo directamente a Octave? Si, efectivamente Octave, al igual que su contra parte cerrada Matlab, puede importar datos de una hoja de cálculo con formato .xls, .ods, .gnumeric y otras más no tan conocidos, con lo cual ya supera a Matlab que solo importa los formatos de MS.
Para poder usar esta función es necesario tener instalado el paquete octave-io y algunas librerías de java según el formato que se desee importar. Yo prefiero usar Synaptic, pero aquí lo pongo para terminal:
# apt-get install octave-io libjopendocument-java libapache-poi-java
La primera librería permite abrir los formatos de OpenDocument mientras la segunda los de MS. También leí que para usar algunas funciones con el formato de MS se necesita estar en entorno Windows con su suite de office instalada, pero yo iba a usar Calc, así que sigo tranquilo en Debian Testing.
Ahora si, de cabeza a Octave, como ahora tiene su nueva interfaz gráfica por defecto la navegación,el historial de comandos y variables son más fáciles de encontrar. Primero activar el paquete io:
pkg load io;
Las opciones de este paquete son para trabajar con OpenDocument son: odsread, odsopen, ods2oct, oct2ods, odsclose, odswrite, odsfinfo y parsecell. Se puede obtener ayuda de cada una escribiendo:
help 'opción';
Después, hay comprobar si las librerías java están cargadas, aunque la respuesta lógica es que no:
javaclasspath;
Devolverá algo como esto:
STATIC JAVA PATH
- empty -
DYNAMIC JAVA PATH
- empty -
Entonces se carga la librería necesaria desde la ubicación donde se instaló, en el caso de Debian es /usr/share/java:
javaaddpath /usr/share/java/jOpenDocument-1.3.jar;
Se verifica de nuevo y devuelve que está cargado
STATIC JAVA PATH
- empty -
DYNAMIC JAVA PATH
/usr/share/java/jOpenDocument-1.3-1.3repack.jar
y se verifica que Octave puede trabajar con los archivos ods con el comando:
chk_spreadsheet_support;
y dará una respuesta creando una variable ans con valor 64, el número varía de acuerdo a los formatos que soporte.
Entonces viene lo bueno: importar y dibujar. Esta es una parte de la hoja de cálculo que hice, los colores son para identificar cuando hacía cambios

Para simplificar, al archivo y la hoja les puse el nombre "Tabla"
Mediante el navegador me moví hasta la carpeta contenedora del archivo. El formato para leer es ( "archivo.ods", "hoja", "rango" )
x = odsread ("Tabla.ods", "Tabla", "F5:AT5");
y = odsread ("Tabla.ods", "Tabla", "E6:E46");
Se crearon dos matrices de 1x41 y 41x1, se las hace cuadradas así
[x,y] = meshgrid(x,y);
Importe los datos para z:
z = odsread ("Tabla.ods", "Tabla", "F6:AT46");
y ya pude dibujar, sea con mesh o con surf
mesh(x,y,z);
surf(x,y,z);
Todavía me hacen falta cambiar algunos valores de esa tabla para poder decir que es un mapa de inyección, pero logré hacer el gráfico que quería sin fundir el procesador.
Espero que les haya gustado, y si tienen algún consejo les quedaré muy agradecido.
Hasta luego.
