3 PaseoMatLab Mat2GIO
3 PaseoMatLab Mat2GIO
)
Trabajo previo
UN PRIMER PASEO POR MatLab
NOTA: Antes de empezar a leer este documento debe haber iniciado una sesión de trabajo en
MatLab
según se indica en el documento Inicio_sesion_MatLab.pdf que ha descargado de
Moodle.
Índice
1. MatLab : Nociones básicas 1
1.1. Algunos detalles útiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
• trabajo interactivo, donde el usuario utiliza la línea de comandos de la ventana Command window para
introducir instrucciones que el programa ejecuta;
• trabajo programado (M-les, cheros con terminación .m), donde el usuario genera uno o varios cheros
con conjuntos de instrucciones, que se pueden ejecutar repetidas veces (con distintos datos) desde el modo
interactivo. De esta forma, el usuario puede incrementar las funciones disponibles en MatLab añadiendo las
suyas propias.
• La orden clc limpia la pantalla de comandos y los borra. Comprobará su utilidad más adelante. La ins-
trucción home tiene efectos parecidos, pero no borra el histórico, al que se puede acceder con la barra de
scroll.
1
• La orden clear borra todas las variables no permanentes. Es posible borrar únicamente alguna de las
variables del espacio de trabajo. Para ello, use la orden clear seguida del nombre de la variable que desea
borrar.
• Si se tienen dudas sobre alguna función de MatLab, existe la orden help que, seguida del nombre de la
función, permite consultar las propiedades de cualquier función de MatLab. Por ejemplo, teclee
>>help clc
Además, hay un menú de ayuda muy potente en la parte superior derecha de la barra de menús que también
incorpora un buscador.
• Si se quiere guardar todo lo que se va a hacer en una sesión de trabajo con MatLab, antes de comenzar los
cálculos (justo al inicio de la sesión) debe teclearse la orden diary nombre_fichero.txt que graba en el
chero de texto nombre_fichero.txt todo lo que se haga en la sesión de trabajo. Con diary o y diary on
desactivamos y activamos la grabación en el chero.
donde NMAT debe reemplazarse por su número de matrícula con cinco dígitos. Al hacerlo, un chero con
este nombre debe aparecer en la ventana Current folder. ½Compruébelo!
• who indica qué variables se están utilizando (whos da una información más amplia sobre el tamaño y tipo
de variable).
• pi es el número π.
• eps es el máquina, es decir, el número positivo más pequeño tal que 1 + 6= 1 en la unidad de coma
otante del ordenador.
>> eps
ans =
2.2204e-016
• inf es innito y NaN es una magnitud no numérica y se obtiene, por ejemplo, como resultado de inde-
terminaciones matemáticas del tipo 0/0 ó ∞ − ∞.
• realmin y realmax son los números reales positivos, más pequeño y más grande respectivamente, que
se pueden utilizar.
MatLab no tiene aritmética entera incorporada. Las operaciones con enteros son realizadas exactamente
mientras ocurran dentro de la precisión máquina (hasta unas dieciséis cifras). Aún así, MatLab reconoce en
cierto modo que se trata de números enteros y devuelve los resultados como si estuviera realizando aritmética
entera. Como ya se ha comentado con anterioridad, en general MatLab trabaja en aritmética de coma otante
de doble precisión. El usuario elige el formato de salida mediante la instrucción format. Algunos formatos son:
format short es el formato por defecto; punto jo y cuatro dígitos decimales.
2
format rat aproximaciones al número racional más cercano.
Por ejemplo:
>> 2/3
ans =
>> 2/3
ans =
0.66666666666667
>> 2/3
ans =
6.666666666666666e-001
>> 2/3
ans =
0.6667
>> 2/3
ans =
6.6667e-001
>> 2/3
ans =
2/3
para recuperar la notación cientíca con cuatro dígitos decimales, que es la que se utilizará de ahora en adelante.
Teclee ahora
>> home
Observe que, como ya se ha comentado anteriormente, el efecto de esta instrucción es llevar el cursor a la parte
superior izquierda de la Command Window. Puede ver las instrucciones introducidas anteriormente yendo hacia
arriba con la barra de scroll.
Teclee ahora
>> clc
Su efecto es limpiar la pantalla de los comandos que se han ido introduciendo, pero no podrá acceder a ellos
mediante la barra de scroll.
Como ya se ha mencionado, ninguna de estas dos instrucciones borra el valor de la variables. Por tanto, si
ahora teclea
>> ans
RECUERDE. En su sesión de trabajo de MatLab debe reproducir todas los resultados que se incluyen en este
documento. Debe por tanto teclear las instrucciones que vaya encontrando. No es necesario teclear el texto que
gura a la derecha del símbolo %.
3
1.2. Aritmética elemental y asignaciones
Como ha quedado dicho con anterioridad, el símbolo >> es el prompt de MatLab e indica que está listo
para aceptar instrucciones. Para ejecutar una orden introducida en la línea de comandos, basta pulsar la tecla
enter. El nombre de la variable a la que se asigna por defecto la salida es ans (abreviatura de answer), pero el
usuario puede asignar la salida a la variable que desee. Cuando se asigna una salida a una variable ya existente,
el valor que esta tenía anteriormente queda eliminado y sustituido por el nuevo. Algunos ejemplos elementales
se muestran a continuación que debe teclear en su sesión de MatLab de arriba a abajo.
• MatLab distingue entre mayúsculas y minúsculas, razón por la cual la variable a y la variable A son distintas.
El nombre de las variables sigue las reglas habituales de un lenguaje de programación: debe comenzar por
una letra, aunque puede contener números; no debe contener espacios en blanco ni algún tipo de símbolo
reservado (coma, punto y coma, dos puntos, guión,...).
Advertencia. Aunque MatLab sí distingue entre mayúsculas y minúsculas, y por tanto es seguro emplear
combinaciones de ambas en nombres de variables, las implementaciones en Windows no hacen estas distin-
ciones para los nombres de los cheros M-les creados por el usuario.
• Las asignaciones en MatLab se realizan como en cualquier lenguaje de programación, pero no requieren
ningún tipo de declaración de variables (en una primera aproximación). Además, por defecto, todas las
variables son matrices y los escalares se toman como un caso particular de matrices 1 × 1.
• Las operaciones se realizan siempre siguiendo el estándar IEEE de aritmética de coma otante de doble
precisión. Sin embargo, los resultados que, por defecto (format short), MatLab muestra por pantalla apa-
recen con (mucha) menos precisión de la que en realidad ha calculado. En esta práctica siempre vamos a
utilizar la representación que muestra los resultados en notación cientíca con cuatro dígitos decimales.
• El efecto de escribir un punto y coma (;) al nal de una instrucción es evitar que se muestre por pantalla
su resultado aunque sí se ejecuta (véase la penúltima instrucción de la columna derecha de los ejemplos
elementales mostrados anteriormente).
• Si se utiliza el símbolo %, todo lo introducido a partir de ahí MatLab lo interpreta como un comentario que
no se ejecuta (véase de nuevo la penúltima instrucción de la columna derecha de los ejemplos elementales
mostrados anteriormente).
4
ans =
La matrices se denen entre corchetes escribiéndolas por las y se utiliza el punto y coma para separar una
la de otra. También se pueden separar los elementos de las las con comas. Cada elemento de una matriz se
reconoce por dos índices (m, n). El primero indica la la y el segundo la columna. Se muestran a continuación
algunos ejemplos elementales de creación y manipulación de matrices que debe reproducir entendiendo lo que
ocurre en cada momento.
5
1.4. Operaciones aritméticas
El producto (*) es, por defecto, la operación de producto de matrices. De la misma manera, las potencias
de una matriz ( ) son los productos repetidos de una matriz por sí misma. El símbolo de división (/) tiene
un signicado más complejo, relacionado con el producto por la inversa del denominador y se discutirá en la
práctica siguiente de la asignatura.
Ahora bien, MatLab también ofrece la posibilidad enormemente útil de realizar productos y divisiones de
vectores y matrices elemento a elemento (operaciones vectorizadas ). Para ello, hay que emplear los símbolos
anteriores precedidos de un punto; es decir:
.* ./ .
El funcionamiento de estos operadores vectorizados se ilustra a continuación mediante algunos ejemplos.
>> .
a *b % multiplicación elemento a elemento
ans =
-2 18 32
>> .
a /b % division elemento a elemento
ans =
>> a2
??? Error using ==> Matrix must be square.
1 36 64
ans =
-26 15
12 -22
>> .
A *B % producto elemento a elemento
ans =
-2 18
32 2
>> .
A /B % dividimos elemento a elemento
6
ans =
-0.5000 2.0000
2.0000 0.5000
>> A . 2
ans =
1 36
64 1
>>
A 2 % al ser una matriz cuadrada es equivalente a A*A
ans =
-47 12
-16 -47
>> C=[4 1; 1 9]
C =
4 1
1 9
>> C.(1/2) % raíz cuadrada elemento a elemento (igual que ejecutar sqrt(C))
ans =
2 1
1 3
>>
C (1/2) % potencia 1/2 de la matriz C (no es lo mismo que sqrt(C))
ans =
1.9899 0.2007
0.2007 2.9933
a =
1 2 3 4 5 6 7 8 9 10
b =
1 3 5 7 9
c =
10 9 8 7 6 5 4 3 2 1
d =
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000
7
En este contexto de generación de listas de números conviene mirar las propiedades de la función linspace
(teclear help linspace). La función linspace(x1,x2,N), que MatLab incorpora, genera un número N de
puntos equiespaciados en el intervalo [x1,x2]. La lista siempre incluye los dos extremos del intervalo.
>> A=[-2 9;4 7] % matriz dos por dos, introducida por las
A =
-2 9
4 7
ans =
ans =
ans =
-2
A =
-2 3
-4 5
-6 7
ans =
-1 4
-2 5
0 9
ans =
56 -68
8
-68 83
ans =
13 23 33
23 41 59
33 59 85
ans =
-9
-17
-25
>> u=[1 2 3]
u =
1 2 3
>> v=[4 5 6]
v =
4 5 6
>> u*v' % la por columna (es un número que se denomina producto escalar)
ans =
32
ans =
4 5 6
8 10 12
12 15 18
A continuación se muestran algunos ejemplos sencillos de lo que se puede hacer con una matriz cuadrada.
ans =
5 5
5 10
ans =
5 5
5 10
ans =
4 1
1 9
>> .
B *B % producto elemento a elemento igual que B . 2
ans =
4 1
1 9
ans =
9
ans =
Bi =
0.6000 -0.2000
-0.2000 0.4000
Importante: Hay que tener cierta precaución con funciones como rank, det ó inv ya que MatLab hace
los cálculos numéricamente (utilizando aritmética de precisión nita). En muchos casos el resultado suele ser
exacto; sin embargo en otros, MatLab puede obtener valores incorrectos por culpa de los redondeos; aún así,
MatLab suele avisar si encuentra una cierta proximidad de la matriz a la singularidad. Por ejemplo:
>> Ai = inv(A); % calcula la inversa pero MatLab produce una advertencia (un warning)
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.243297e-18.
EJERCICIO 1: Haga el producto de la matriz A por su inversa. Lo puede conseguir mediante la instrucción:
>> A*Ai
Aparece aquí uno de los problemas más importantes que presenta el cálculo numérico con aritmética de
presión nita. A lo largo del curso se estudiarán estos problemas en el contexto del Álgebra lineal que, en
particular, darán lugar a la introducción del concepto de número de condición de una matriz. No obstante, el
ejemplo anterior ya pone claramente de maniesto que hay que tomar precauciones a la hora de utilizar los
resultados numéricos que proporciona un ordenador, estableciendo criterios que permitan conar en los mismos.
La instrucción magic que se acaba de utilizar es una de las muchas funciones que posee MatLab para crear
matrices sin tener que introducirlas elemento a elemento (teclear help gallery para ver una lista de algunas
de estas funciones). Algunos ejemplos importantes son:
A =
1 1 1
1 1 1
1 1 1
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
ans =
1 0
0 1
ans =
1 0 0
0 3 0
0 0 -4
ans =
10
>> diag(diag(A)) % truco para extraer la diagonal de una matriz
ans =
1 0
0 4
Utilizaremos también la función rand para generar matrices cuyas entradas son números generados de forma
pseudoaleatoria.
A =
2 3
4 5
6 7
ans =
>> A(2,3)
>> A(:,1) % vector columna con la primera columna de A (nótese el uso del operador :)
ans =
ans =
4 5
ans =
ans =
3 2
ans =
ans =
ans =
La referencia a elementos de una matriz permite cambiar el valor de un elemento mediante una sencilla
operación de asignación. Esto también se puede hacer con una la o columna.
11
>> A(3,1)=1/2 % cambio de un elemento de A
A =
2.0000 -3.0000
-4.0000 5.0000
0.5000 -7.0000
>> A(2,:)=[1 1]
A =
2.0000 -3.0000
1.0000 1.0000
0.5000 -7.0000
Al denir un nuevo elemento fuera de las dimensiones de la matriz se reajusta el tamaño de la matriz dando
el valor 0 a los restantes elementos >> A(3,4)=1 % asignación fuera del espacio denido
A =
2.0000 -3.0000 0 0
-4.0000 5.0000 0 0
ans =
3 4
La matriz vacía es la matriz que no tiene ningún elemento. Se escribe entre corchetes (es decir, [ ]) y puede
ser muy útil a la hora de borrar las o columnas de una matriz dada, como se ve en el siguiente ejemplo,
A =
1 2
2 1
0 -3
EJERCICIO 2: Construya una matriz 6x6 aleatoria. Para ello teclee las instrucciones:
>> rand('state',NMAT) % NMAT debe ser su número de matrícula con cinco dígitos.
>> A=rand(6);
En la matriz A, haga igual a cero los elementos de las las 3 y 4 e igual a 1 los elementos de las las 1 y 6
y asigne el resultado a una variable B.
EJERCICIO 3: Construya una matriz 6x6 aleatoria. Para ello teclee las instrucciones:
>> rand('state',NMAT) % NMAT debe ser su número de matrícula con cinco dígitos.
>> C=rand(6);
MatLab puede trabajar con grupos de las y columnas (no necesariamente consecutivos) o concatenar ma-
trices para formar matrices más grandes siempre que los tamaños sean compatibles. >> A = diag([1 2 3]);
ans =
1 0 0 1 1
0 2 0 1 1
0 0 3 1 1
ans =
1 0 0
0 2 0
12
0 0 3
1 0 0
0 1 0
0 0 1
B =
1 3 1 0
2 1 0 1
0 0 1 3
0 0 2 1
En general, empleando listas implícitas o simplemente vectores de índices, se pueden extraer submatrices de
una matriz, incluso repitiendo las y columnas.
B =
1 3 1 0 -1
2 1 0 1 7
0 0 1 3 4
0 0 2 1 9
ans =
1 0 1
0 1 3
ans =
2 1 0
ans =
1 1 -1
ans =
2 1 0 1 7
ans =
ans =
ans =
0 0 1 3 5
1 3 1 0 -1
1 3 1 0 -1
13
ans =
-2
-2
Este forma de manipular matrices proporciona un método sencillo para intercambiar las o columnas de una
matriz.
A =
2 3
1 4
7 6
A =
7 6
1 4
2 3
EJERCICIO 4: Construya una matriz 6x6 aleatoria. Para ello teclee las instrucciones:
>> rand('state',NMAT) % NMAT debe ser su número de matrícula con cinco dígitos.
>> E=rand(6);
En la matriz E, intercambie las columnas 3 y 5 y, en la matriz resultante, intercambie las las 1 y 3. Asigne
el resultado a una variable F.
ans =
-7 1 1 2 3 3 5
A =
-2 4 7
5 -6 -4
-2 -7 -9
ans =
-2 -7 -9
-2 -6 -4
5 4 7
El orden descendente se puede obtener a partir del ascendente con cambios de posiciones de los elementos,
pero también con un doble cambio de signo:
EJERCICIO 5: Construya una matriz 6x6 aleatoria. Para ello teclee las instrucciones:
>> rand('state',NMAT) % NMAT debe ser su número de matrícula con cinco dígitos.
>> G=rand(6);
A partir de G, genere otra matriz cuyas columnas 1, 3 y 5 no cambien, pero las columnas 2, 4 y 6 estén
ordenadas de forma ascendente. Asigne el resultado a una variable J.
14
½½ATENCIÓN!! Una vez nalizado este Paseo por MatLab , teclee en la línea de comandos
la instrucción
>> diary o
15