PrInf02: Vectores y matrices

De MateWiki
Revisión del 12:07 16 sep 2013 de Herraiz (Discusión | contribuciones) (Comienzo con vectores)

Saltar a: navegación, buscar
Práctica de Informática
Vectores y matrices
Práctica anterior Siguiente práctica
Este artículo es un guión de prácticas de Informática


En esta práctica vamos a crear y modificar vectores y matrices. En Octave UPM cualquier valor es una matriz. Por ejemplo, un escalar es en realidad una matriz con una sola columna y una sola fila. Del mismo modo, un vector no es más que una matriz que tiene una sola fila o una sola columna. Octave UPM está diseñado para facilitar el trabajo con matrices, de ahí que incluso un escalar sea considerado una matriz. Incluso si no queremos hacer cálculos matriciales, es importante entender cómo funcionan los vectores y las matrices, porque los emplearemos para otras tareas como gráficos, o repetir conjuntos de comandos usando bucles.

1 Videos previos

Antes de realizar esta práctica, es recomendable ver estos vídeos del Curso de Introducción a la Programación. No es imprescindible verlos antes de hacer la práctica, pero sí recomendable. Si no has podido verlos antes, empieza la práctica, y vuelve a los vídeos después de la práctica.

2 Vídeos posteriores

Cuando hayas terminado esta práctica, consulta los siguiente vídeos para afianzar los conocimientos:

3 Comandos que se aprenderán en esta práctica

En esta práctica vamos a ver qué significan los siguientes comandos de MATLAB / Octave

Operador : linspace length Operador '
zeros ones size fix rot90

4 Contenido de la práctica

4.1 Comienzo con vectores

  1. Crea un vector fila que contenga con todos los números del 1 al 5, en orden ascendente.
  2. ¿Qué ocurre cuando el operador : va más allá del límite indicado? Por ejemplo, ¿qué vector se genera al ejecutar 1:2:6? ¿Por qué?
  3. ¿Cómo podemos generar el vector [math][9, 7, 5, 3, 1][/math] usando el operador :?
  4. Crea un vector cuyo primer elemento sea 3, el último sea 15, y donde la diferencia entre dos elementos consecutivos sea siempre igual. El vector tiene que tener 18 elementos.
  5. Si tengo dos vectores, uno llamado a que contiene [3,2,1], y otro llamado b que contiene [4,5,6], ¿qué obtengo si ejecuto [a b]? ¿Qué operación ha ocurrido?
  6. Tenemos un vector creado usando el código
    v = 1:2:15
    ¿Qué ocurre si ejecuto v(5)? ¿Qué valor he obtenido? ¿Por qué?
  7. Si con el mismo vector ejecuto v(4:6), ¿qué obtengo? ¿Por qué?
  8. De nuevo, ejecutamos ahora v([1 3 5 2 4]). ¿Qué resultado he obtenido? ¿Por qué?
  9. Ahora intento ejecuto v(-2). ¿Por qué obtengo un error?
  10. Seguimos con el mismo vector, y ahora intentamos v(12). ¿Qué ocurre?

4.2 Modificación de vectores

  1. Seguimos con el vector v creado en los puntos anteriores. ¿Cómo podemos poner el valor -7 en la posición 3 del vector?
  2. Nos dicen que ejecutemos este código
    length(v)
    A juzgar por el resultado, ¿qué hace la función length?
  3. Antes, al intentar recuperar la posición 12 del vector, hemos obtenido un error. Ahora intentaremos poner el valor 42 en la posición 12 del vector v. ¿Cuál es el tamaño del vector ahora? ¿Podrías explicar qué ha ocurrido?
  4. Con el nuevo vector v, vamos ahora a ejecutar v(7) = []. ¿Qué ha hecho ese comando? Comprueba la longitud del vector v tras ejecutarlo.

4.3 Vectores fila y columna

  1. El vector v es un vector fila. ¿Cómo puedes hacer una copia de v en la variable w de manera que el vector w sea columna?

4.4 Creación de matrices

Hasta ahora hemos creado, modificado y transformado vectores. Vamos a ver cómo realizar operaciones parecidas con matrices.

  1. Crea una matriz que contenga [math]\displaystyle \begin{pmatrix}4 & 3 & 1\\2 & 5 & 6\end{pmatrix}[/math]
  2. Vamos a crear una matriz que tenga tres filas. La primera fila contendrá todos los números del 1 al 5. La segunda todos los números del 6 al 10. La tercera todos los números del 21 al 25. Intenta crear la matriz usando el operador :, no escribas todos los números directamente.
  3. ¿Qué ocurre al ejecutar el siguiente código?
    M = [3 5 7; 1 2]
    ¿Por qué no funciona?
  4. ¿Qué hacen el siguiente comando?
    rand(3)
  5. ¿Y el comando?
    rand(2,4)
  6. Hemos ejecutado el comando rand(3) y hemos obtenido la matriz [math]\displaystyle \begin{pmatrix}0.05814& 0.27735 & 0.12352\\ 0.02450 & 0.55787 & 0.09848\\ 0.72016 & 0.52356 & 0.35967\end{pmatrix}[/math]. ¿El resultado que has obtenido tú es igual o diferente? ¿Por qué? ¿No debería ser igual si es el mismo comando?
  7. ¿Qué ocurre al ejecutar zeros(3)? ¿Y si ejecuto zeros(7,1)? ¿Qué hace el comando zeros?
  8. Repite el paso anterior, pero usando el comando ones en vez de zeros. ¿Qué hace el comando ones?

4.5 Modificación de matrices

Vamos a crear una matriz con el comando
M = [1:3; 4:6; 5:7]
  1. Obtén el elemento que está en la fila 2 columna 3 de la matriz M
  2. Obtén la primera fila de la matriz. A continuación, obtén la segunda columna.
  3. Ejecuta M(7). ¿Qué obtienes? ¿Puedes averiguar qué ha ocurrido?
  4. Cambia el valor del elemento en la segunda fila y tercera columna, para que tenga el valor 42.
  5. ¿Qué ocurre al ejecutar este código?
    M(:,1)=[10;11;12]
  6. ¿Y si ejecuto el siguiente código?
    M(:,1)=[20 21 22]
    ¿Cuál es la diferencia con el anterior?
  7. ¿Qué ocurre al ejecutar el siguiente código?
    M(2,:)=[]
  8. ¿Por qué no permite la siguiente operación?
    M(1,1)=[]
  9. Elimina la tercera columna de la matriz.

4.6 Dimensiones de matrices

Creamos la matriz M con el comando
M = [1:3; 5:7]
  1. El comando length no es adecuado para saber el tamaño de una matriz. Por ejemplo, ¿qué devuelve length(M)? ¿A qué corresponde el resultado?
  2. ¿Qué obtendremos si ejecutamos el siguiente código?
    length([M; M])
    ¿A qué corresponde ahora el resultado?
  3. Compara los resultados anteriores con el resultado de ejecutar
    size(M)
    ¿Qué devuelve el comando size?
  4. ¿Qué deberíamos obtener si ejecutamos el siguiente código?
    size([M; M])
    Intenta averiguarlo antes de ejecutar el código.
  5. ¿Y si cambiamos ligeramente el código?
    size([M M])
    ¿Cuál es el resultado ahora? Intenta averiguarlo antes de ejecutar el código.
  6. El comando size siempre devuelve dos resultados. ¿Cómo podemos guardar los resultados en variables diferentes? Comprueba qué obtienes al hacer
    [f c] = size(M);
    ¿Qué contienen las variables f y c?
  7. Tenemos una matriz X de dimensión desconocida. Quiero crear una matriz del mismo tamaño que X, pero que contenga 1 en todas las posiciones. ¿Puedes resolver este problema con lo que ya sabes sobre matrices?

5 Ejercicios post-práctica

  1. El comando fix elimina la parte decimal de un número, o de los elementos de una matriz o un vector. Usa el comando fix para generar una matriz de 3 filas y 4 columnas que contenga números aleatorios entre el 5 y 17, sin parte decimal en ninguno de los elementos de la matriz. Llama a esta matriz A.
  2. Existe una función rot90 que creemos que hace algo parecido al operador ' (traspuesta). Usa la matriz A del apartado anterior para averiguar cuál es la diferencia entre rot90 y el operador '. Puedes consultar la ayuda del operador ' con help transpose.
  3. Hemos visto cómo acceder a los elementos de una matriz conociendo su posición. También se pueden acceder usando valores lógicos, que veremos en detalle en próximas prácticas. Intenta buscar la manera para crear una matriz B con los mismos elementos que A, excepto que los que sean mayores que 9 deben convertirse en 0. Intenta hacer este ejercicio de dos maneras diferentes. El vídeo Prog30: Otras operaciones con matrices puede ayudarte a realizar este ejercicio.
  4. Un compañero nos presenta el siguiente código, resultado de una sesión en Octave UPM
>> X = transpose(dlmread("data.txt"));

>> size(X)
  ans =     4   4

>> C = cov(X)
C =  
   0.04384  -0.00415   0.00742   0.02772  
  -0.00415   0.12012  -0.05663   0.04076  
   0.00742  -0.05663   0.07462  -0.06782  
   0.02772   0.04076  -0.06782   0.09102

>> [v,D] = eig(C)
 v =  -0.47295   0.71425   0.51310   0.05381
       0.09069   0.46289  -0.62590   0.62110 
       0.65007   0.52002  -0.06700  -0.55000  
       0.58780  -0.07183   0.58351   0.55574
 D =
     Diagonal Matrix  
     0.00000        0        0        0
           0  0.04377        0        0
           0        0  0.07946        0        
           0        0        0  0.20638

>> PC1 = X*v[:,4];
parse error:  syntax error

>>> PC1 = X*v[:,4];
             ^

¿Para qué sirven las funciones transpose, dlmread, cov y eig? ¿Por qué no funciona el código? Crea una X matriz aleatoria de 4 por 4, con números entre 0 y 1 en todos los elementos, e intenta arreglar ese código. ¿Cuáles son las dimensiones de PC1?