Curso de Octave

Pablo Barrera González

Grupo de Usuarios de Linux
figuras/gul.png

Universidad Carlos III de Madrid

Jueves, 3 de abril de 2003



(page 1)


Índice



(page 2)


¿Qué es Octave?



(page 3)


¿Qué no es Octave?




(page 4)


Breve historia de Octave




(page 5)


Versiones



(page 6)


Otras alternativas















(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



(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:

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



Truco: Colocando un ; al final de una línea no devuelve el resultado por pantalla. El ; también sirve para separar operaciones.



(page 13)


Otras funciones disponibles




(page 14)


Definir rangos


Se usan los ":"

octave2.1:18> x = 1:5
x =

1 2 3 4 5
octave2.1:19> x = 1:2:10
x =

1 3 5 7 9

También es útil la función linspace.


(page 15)


Acceder a las posiciones de una matriz


Se usa la coordenada entre paréntesis.

octave2.1:20> x(2)
ans = 3

Por supuesto se puede asignar un valor a una posición.

octave2.1:20> x(2) = 5
x =

1 5 5 7 9

Nota: En Octave, al igual que en Matlab, la numeración comienza en 1.


(page 16)


Acceder a las posiciones de una matriz (II)


Si tiene dos dimensiones, se emplean dos coordenadas:

octave2.1:22> A = rand(3,3); A(2,1)
octave2.1:23> A(2,1)
ans = 0.052414



(page 17)


Acceder a porciones de matrices



octave2.1:24> x = 1:5;
octave2.1:25> x(1:3)
ans =

1 2 3

octave2.1:26> x(1:2:5)
ans =

1 3 5



(page 18)


Acceder a porciones de matrices (II)


octave2.1:29> x = magic(3)
ans =

8 1 6
3 5 7
4 9 2

octave2.1:30> x(1,:)
ans =

8 1 6


(page 19)


Acceder a porciones de matrices (II)


octave2.1:29> x = magic(3)
ans =

8 1 6
3 5 7
4 9 2

octave2.1:30> x(1,:)
ans =

8 1 6



(page 20)


Acceder a porciones de matrices (III)


Se pueden hacer muchas cosas interesantes:

octave2.1:32> x=1:5;
octave2.1:33> x(length(x):-1:1)
ans =

5 4 3 2 1


octave2.1:34> x(find(x==3))
ans = 3




(page 21)


Añadiendo a matrices


x = [nuevo, x];

x = [x , nuevo];
x(length(x)+1) = nuevo;

x = [x ; nuevo];




(page 22)


Relaciones lógicas



Nota: Matlab sólo soporta la relación lógica de diferencia ~=


(page 23)


Operadores lógicos



Nota: Matlab sólo soporta el operador lógico de negación ~

(page 24)


Operaciones por coordenadas



octave2.1:1> x = [1, 2];
octave2.1:2> y = [3, 4];
octave2.1:3> x*y
error: operator *: nonconformant arguments (op1 is 1x2, op2 is 1x2)
error: evaluating binary operator `*' near line 3, column 2
octave2.1:3> x.*y
ans =

3 8

(page 25)


Constantes especiales


Hay variables con unos valores predefinidos:

Nota: algunas de estas variables pueden ser sobreescritas por el usuario.



(page 26)


Iteraciones para


Forma de bucle:

for indice = lista_de_valores_que_puede_tomar
...
end

Ejemplos de listas de valores


(page 27)


Ejemplo con for


Construir una matriz de Hilbert.
En cada posición de la matriz (i,j) tenemos 1/(i+j-1).

for i = 1:m
for j = 1:n
H(i,j) = 1/(i+j-2);
end
end


(page 28)


Iteraciones mientras


Forma del bucle

while condicion
...
end


(page 29)


Ejemplo con while


n = 0;
while 2^n < limite
n = n + 1;
end
n




(page 30)


Condiciones


Forma general con múltiples ramificaciones:

if condicion
...
elseif condicion
...
else condicion
...
end


(page 31)


Manejando la interfaz





(page 32)


Funciones escalares


Sin comentarios...

(page 33)


Funciones vectoriales


Aquí tampoco hay nada que comentar




(page 34)


Funciones matriciales


Otra tanda más de funciones


(page 35)


Mostrar los resultados por pantalla


Varias opciones:


Ejemplos
x=pi^2
disp("pi al cuadrado es"), disp(pi^2)
fprintf("pi al cuadrado es %f\n", pi^2)



(page 36)


Guiones con Octave



Trucos


(page 37)


Creación de funciones


También se pueden definir funciones

function valores_salida = nombre_funcion(valores_entrada)
...

[endfunction]


(page 38)


Ejemplo de una función


Generamos una matriz cuadrada con valores aleatorios entre 0 y 9.

function matriz = entale(dimension)
matriz = floor(10*rand(dimension))


(page 39)


Formatos de salida






(page 40)


Octave y los gráficos




(page 41)


Ejemplo de un gráfico sencillo


octave:15> t = linspace(0,2*pi,100);
octave:16> x = sin(t);
octave:17> plot(t,x)
octave:18> grid
octave:19> replot
figuras/seno.png


(page 42)


Ejemplo de un gráfico más elaborado


octave:55> t=linspace(-5,5,100);
octave:56> mesh(sinc(t)'*sinc(t))
figuras/sinc3.png



(page 43)


Cómo guardar los gráficos al disco duro


Usando gnuplot. Desde Octave tecleo:
gset terminal TERMINAL
gset output "FICHERO"
replot
gset terminal X11 % para volver al modo normal

Los dos terminales más importantes:

Como quitar la leyenda:
gset nokey


(page 44)


Algunas grupos de herramientas




(page 45)


Diferencias con Matlab




(page 46)


Sabor a Matlab


PS1 = ">> "
PS2 = ""
beep_on_error = 1.0
default_eval_print_flag = 0.0
default_save_format = "mat-binary"
define_all_return_values = 1.0
do_fortran_indexing = 1.0
empty_list_elements_ok = 1.0
fixed_point_format = 1.0
implicit_num_to_str_ok = 1.0
implicit_str_to_num_ok = 1.0
ok_to_lose_imaginary_part = 1.0
page_screen_output = 0.0
prefer_column_vectors = 0.0
prefer_zero_one_indexing = 1.0
print_empty_dimensions = 0.0
treat_neg_dim_as_zero = 1.0
warn_function_name_clash = 0.0
whitespace_in_literal_matrix = "traditional"


(page 47)


Otras aplicaciones para trabajar con Octave


Koctavefiguras/koctave0.5.jpg

(page 48)


Otras aplicaciones para trabajar con Octave


Qmatplot, antes Kmatplot figuras/kmatplot.jpg


(page 49)


Trucos para mejorar el rendimiento




(page 50)


Unas cuantas funciones más para nota



(page 51)


Añadiendo funciones en C++


Es posible añadir funciones compiladas en C++.

(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 ());

dx(0) = 77.27 * (x(1) - x(0)*x(1) + x(0) - 8.375e-06*pow (x(0), 2.0));
dx(1) = (x(2) - x(0)*x(1) - x(1)) / 77.27;
dx(2) = 0.161*(x(0) - x(2));

return octave_value (dx);
}


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

(page 55)


Referencias básicas



(page 56)


Tiempo para el público





¿Preguntas?
¿Comentarios?
¿Insultos?








(page 57)