Guillem Borrell i Nogueras
10-13 de Junio de 2008
En Matlab casi todo es una función. Cada una de ellas contiene una pequeña ayuda para que no sea necesario consultar ningún manual. Para consultar la ayuda disponemos de la función help:
>> help eig
>> % Este comando será ignorado >> 'hola' % 'Hola,Matlab!' ans = hola >> 'hola'; >> 'hola', 'que tal' ans = hola ans = que tal >> 'hola', ... 'que tal' ans = hola ans = que tal
Matlab tiene un tipo numérico por omisión. Cualquier otro tipo tendrá que asignarse explícitamente
Ejemplo:
>> 1:5 1 2 3 4 5 >> 0:2:10 0 2 4 6 8 10
>> M=[1,2,3;4,5,6;7,8,9]
Escribir
`M=[(1,2,3),(4,5,6),(7,8,9)]`de otros 3 modos posibles
Los arrays indexables del modo usual
>> M(1,1) ans = 1 >> M(end,end) %truco del mandruco ans = 9
>> a = pi a = 3.1416 >> a(1) ans = 3.1416 >> a(1,1) ans = 3.1416 >> a(1,1,1) ans = 3.1416
>> a=rand(3,3) a = 0.583220 0.285967 0.010804 0.336715 0.530313 0.860391 0.060404 0.999098 0.501339 >> a(3,4) error: invalid column index = 4
octave:2> nuevo(4)=1 nuevo = 0 0 0 1 octave:3> nuevo(4,3)=2 nuevo = 0 0 0 1 0 0 0 0 0 0 0 0 0 0 2 0
Supongamos que de la matriz
`M=[(11,12,13,14,15),(21,22,23,24,25),(31,32,33,34,35),(41,42,43,44,45),(51,52,53,54,55)]`queremos extraer
`S=[(33,34,35),(43,44,45),(53,54,55)]`Los subíndices se seleccionan mediante secuencias. En este caso queremos `M_{ij}` con i de 3 a 5 y j de 3 a 5. El incremento de 1 podemos omitirlo
>> S = M(3:5,3:5) 33 34 35 43 44 45 53 54 55
Y para extraer `T=[(11,13,15),(21,23,25),(31,33,35),(41,43,45),(51,53,55)]`?
>> M(:,1:2:5) ans = 11 13 15 21 23 25 31 33 35 41 43 45 51 53 55
Números complejos: | |
---|---|
El número imaginario en Matlab es como cualqier otro y se expresa con i, I, j, J | |
Argumentos lógicos: | |
Son true y false. 0 es falso y cualquier otro número es verdaero. |
>> s='aupacai' s = aupacai >> s(4) ans = a >> s(1:end-2) ans = aupac >> [s,'campeon'] %concatenar ans = aupacaicampeon
Crear el siguiente vector mediante secuencias. En Matlab no hay list comprehensions.
Del anterior vector seleccionar los elementos 1, 32, 56 y 67. Hay que tener un poco de inventiva.
Matlab permite agrupar variables en forma de árbol:
>> ed.num=1.234; >> ed.str='hola'; >> ed.logic.true=1; >> ed.logic.false=0; >> ed ed = str: 'hola' num: 1.2340 logic: [1x1 struct]
Otra manera de agrupar variables es utilizar una estructura parecida a una matriz. Para iniciarla utilizaremos llaves en vez de corchetes:
>> celda={1.234,'hola';true,false} celda = [1.2340] 'hola' [ 1] [ 0]
Los Function Handles sirven para asignar una función a una variable. Es el recurso más complejo pero a la vez más potente de Matlab. Su símbolo es la arroba ( @ ):
>> fhsin=@sin fhsin = @sin >> fhsin(pi/2) ans = 1
Construir una estructura de datos que contenga las funciones trigonométricas sin, cos, y tan y llamarlas en el punto `\pi / 2` a partir de la misma estructura
Operadores matriciales: | |
---|---|
+,-,*,/,^ | |
Operadores escalares: | |
.*,./,.^ | |
Operadores lógicos: | |
&,|,! | |
Operadores de comparación: | |
<,>,==,>=,<=,!= | |
Operadores de conjuntos: | |
&&,|| |
Operadores matriciales y escalares pueden confundirse fácilmente:
>> a=rand(3,3); >> a=rand(3,3);b=rand(3,3); >> a*b ans = 1.0297 0.9105 0.3293 0.9663 0.8267 0.4211 0.5355 0.4318 0.3279 >> a.*b ans = 0.1824 0.3253 0.0563 0.5500 0.6003 0.1897 0.0458 0.0017 0.1822
O dar resultados extraños:
>> a=[1,2,3;4,5,6;7,8,9]; >> a.^pi ans = 1.0000 8.8250 31.5443 77.8802 156.9925 278.3776 451.8079 687.2913 995.0416 >> a^pi ans = 1.0e+03 * 0.6943 - 0.0004i 0.8540 - 0.0001i 1.0136 + 0.0002i 1.5743 - 0.0000i 1.9344 - 0.0000i 2.2946 + 0.0000i 2.4543 + 0.0003i 3.0149 + 0.0001i 3.5756 - 0.0002i
con `A=((1,2,3),(4,5,6),(7,8,9))`, `b=((1),(2),(3))` y `c=(1,2,3)`
calcular
luego aplicar al resultado de cada operación la función `x^2 \sin x`
Este es un ejemplo del uso de la sentencia if:
if saludo disp('hola') else disp('no te saludo') end
¿Cuál es la salida si saludo=1?
Ejemplo del uso de la sentencia for:
function primetest(n) sprintf('Números primos de 1 a %i\n',n) for i=1:n if isprime(n) disp(i) end end
¿Cuál es la salida de esta subrutina si n=9?
case: | Control de casos cerrados |
---|---|
while: | Bucle controlado por condición lógica |
try: | Sentencia de control para probar errores |
break: | Clave para el control de bucles |
continue: | Idem |
return: | Devuelve el control al programa principal |
Una de las posibilidades de los Function Handles es definir funciones sin necesidad de un archivo adicional. Por ejemplo:
>> testaf = @(x,y) exp(-(x.^2+y.^2)) >> testfh(1,i) ans = 1
Inlining
octave:1> a=rand(3,3)(1,2) a = 0.14272
Permite expresiones mucho más compactas.
Declaración de funciones
octave:2> function y=foo(x) > y=3*x > end octave:3> foo(4) y = 12 ans = 12
¿A qué espera Mathworks para arreglar esto?
El precio
Con estas funciones se puede crear casi cualquier matriz
eye: | Matriz de ceros con unos en la diagonal |
---|---|
linspace: | Vector de elementos equiespaciados |
logspace: | Vector de elementos espaciados exponencialmente |
meshgrid: | Matrices equiespaciadas de dos dimensiones |
ones: | Matriz de unos |
zeros: | Matriz de ceros |
rand: | Matriz de números pseudoaleatorios. |
reshape: | Cambia la forma de la matriz conservando el número de elementos |
---|---|
transpose: | Traspuesta. Equivale a .' |
ctranspose: | Matriz conjugada. Equivale a ' |
rot90: | Gira la matriz 90 grados en sentido antihorario. |
Generar la matriz
`L=((-2,1,0,0,0,0,1),(1,-2,1,0,0,0,0),(0,1,-2,1,0,0,0),(0,0,1,-2,1,0,0),(0,0,0,1,-2,1,0),(0,0,0,0,1,-2,1),(1,0,0,0,0,1,-2))`Usando también la función diag
Para resolver sistemas de eucuaciones lineales contamos con un operador universal:
>> A=[1,0;2,1];y=[2;4]; >> x=A\y x = 2 0
¿En qué se diferencia de la división?