Principales diferencias entre Octave y Matlab (TM)
Algunas toolbox disponibles.
Otras aplicaciones para trabajar con Octave.
Ampliando Octave con C++.
Dudas y ejemplos.
(page 2)
¿Qué es Octave?
Lenguaje de alto nivel para cálculos numéricos.
Interfaz de línea de comandos para resolver tanto problemas lineales como no lineales de forma numérica.
Extensible, ajustable con el lenguaje propio o con módulos en C, C++ y Fortran.
Es software libre, con licencia GPL (General Public License).
(page 3)
¿Qué no es Octave?
No es la solución a todos tus problemas (pero casi).
No van a saber matemáticas por ti.
Aunque te va a ayudar a hacer cálculos.
No es Matlab.
Aunque la utilización es prácticamente igual.
No es un lenguaje compilado.
Su propósito es muy concreto.
No es lo más rápido posible.
Pero si se programa muy rápido.
(page 4)
Breve historia de Octave
Creado en 1988 por John W. Eaton, y otros, en el campo de los reactores químicos.
Necesitaban una herramienta para realizar numerosos cálculos.
A la vez debía ser muy sencilla de manejar y lo más general posible.
En la primavera 1992 comienza a desarrollarse en serio.
El 4 de enero de 1993 se distribuye una versión alfa.
El 17 de noviembre de 1994 aparece la versión 1.0.
El nombre proviene de un profesor que hacía cálculos rápidos de cabeza.
(page 5)
Versiones
En la actualidad hay dos versiones de Octave
La versión estable: Ver. 2.0.17, del 12 de Abril de 2002
La versión inestable: Ver. 2.1.44 del 3 de Febrero de 2003
En mi opinión, la inestable solo tiene de inestable el nombre.
Aunque la que se suele instalar por defecto es la estable.
Existen más funciones para la versión inestable, incluidas herramientas muy interesantes (señal, proceso de imágenes, sonido, ...)
Además es más rápida (utiliza la biblioteca ATLAS).
(page 6)
Otras alternativas
Matlab
No es ni libre ni gratis.
Scilab:
El lenguaje no es compatible con Octave.
Numeric Python
PDL (Perl Data Language)
C, C++, Fortran, Bash...
Hay otras opciones.
(page 7)
Invocación del programa
Solo hay que llamar al interprete desde línea de comando:
pablo@tormenta:~$ octave
GNU Octave, version 2.0.16.92 (i386-pc-linux-gnu).
Copyright (C) 1996, 1997, 1998, 1999, 2000 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.
octave:1> exit
pablo@tormenta:~$
(page 8)
Jugando con las variables
En Octave hay un tipo de objeto principal: la matriz.
En las versiones más modernas también existen estructuras de datos.
Todas las operaciones están definidas sobre matrices.
Una variable se puede definir en cualquier momento simplemente asignándole un valor.
El valor puede pasarse tanto de forma directa como usando la salida de una función.
(page 9)
Ejemplo
octave:1> A = [1 2 3; 4 5 6]
A =
1 2 3
4 5 6
octave:2> B = randn(2,3)
B =
1.09471 -0.68816 0.43064
0.27045 0.35705 -0.35804
(page 10)
Matemáticas básicas
Operaciones básicas entre matrices:
Asignación: =
Suma: +
Resta: -
Multiplicación: *
Potencia: ^
Transponer: '
División: /
Ojo, todas estas operaciones son matriciales.
(page 11)
Ejemplos
octave:3> A+A
ans =
2 4 6
8 10 12
octave:4> A'*A
ans =
17 22 27
22 29 36
27 36 45
(page 12)
Creación de Matrices
Se pueden asignar a mano:
A = [1,2,3; 4,5,6];
Se pueden tomar como la salida de una función:
A = rand(10,10);
Las funciones típicas son:
ones(filas, columnas): matriz con todo 1.
zeros(filas, columnas): matriz con todo 0.
rand(filas, columnas): matriz aleatoria entre 0 y 1.
(page 47)
Otras aplicaciones para trabajar con Octave
Koctave
(page 48)
Otras aplicaciones para trabajar con Octave
Qmatplot, antes Kmatplot
(page 49)
Trucos para mejorar el rendimiento
Intenta evitar los bucles for.
Mucha veces puedes hacer lo mismo con una multiplicación de matrices.
Intenta reservar memoria al principio en vez de ir incrementado las matrices poco a poco.
Borra las variables que no sirvan ya para nada.
Guarda los índices de una matriz en vez de los valores.
(page 50)
Unas cuantas funciones más para nota
eval: Ejecuta la cadena de caracteres de entrada como un comando de Octave.
fopen, fprintf, fscanf: Permiten abrir y guardas datos en archivos.
reshape: Cambia el tamaño de una matriz.
exist: Existe una variable.
fft, ifft: Transformada rápida de Fourier e su inversa.
global: Define una variable global.
subplot: Permite hacer regiones dentro de gnuplot.
tic,toc: Mide tiempo desde tic hasta toc.
pause: Hace una pausa hasta que el usuario toca una tecla.
loadimage: Carga una imagen.
loadaudio, record: Carga un sonido.
menu: Permite hacer menús de texto con múltiples opciones.
addpath: Añade un directorio a la ruta de búsqueda.
str2mat: De cadena de caracteres a matriz.
str2num: De cadena de caracteres a número.
num2str: De número a cadena de caracteres.
(page 51)
Añadiendo funciones en C++
Es posible añadir funciones compiladas en C++.
Enlazan dinámicamente
La velocidad de ejecución es muy alta.
Difíciles de hacer, la documentación es muy mala.
Pero no imposible.
Todas las funciones y objetos de Octave están disponibles con la liboctave.
Matrices
Vectores
Matrices dispersas
Cadenas de caracteres
Estructuras
Todos son objetos de C++.
Es posible usar la liboctave como soporte matemático para nuestros programas en C++.
Aunque no está pensada para esto.
(page 52)
hello.cc
include
include
DEFUN_DLD (hello, args, ,
"[...] = hello (...)\n\
\n\
Print greeting followed by the values of all the arguments passed.\n\
Returns all arguments in reverse order.")
{
octave_value_list retval;
octave_stdout << "Hello, world!\n";
int nargin = args.length ();
for (int i = 0; i < nargin; i++)
{
octave_value tmp = args (i);
tmp.print (octave_stdout);
retval (nargin-i-1) = tmp;
}
return retval;
}
(page 53)
oregonator.cc
include
DEFUN_DLD (oregonator, args, ,
"The `oregonator'.\n")
{
ColumnVector dx (3);
ColumnVector x (args(0).vector_value ());
(page 54)
Ejemplo práctico: guardar una matriz con el formato de las SVM
// $Id: curso_octave.mgp,v 1.8 2003/04/03 15:34:42 pablo Exp $
include
include
include
DEFUN_DLD (write_svm_file, args, args_out,
"write_svm_file(X,Y,file)\nGuarda en el archivo file la matriz X con las etiquetas Y.")
{
Matrix vectors(args(0).matrix_value ());
ColumnVector labels(args(1).vector_value ());
string file_name(args(2).string_value());
FILE *handle = fopen(file_name.c_str(),"w");
for (int i=0; i
fprintf(handle, "%i ", int(labels.elem(i)));
for(int o=0; o
fprintf(handle, "%i:%f ", o+1, vectors.elem(i,o));
}
fprintf(handle, "\n");
}
fclose(handle);
return octave_value();
}