Fonaments d’Informàtica 1r curs d’Enginyeria Industrial Práctica 7: Vectores y Matrices (II) Objetivos de la práctica El objetivo de las prácticas 6 y 7 es introducir las estructuras de datos vector y matriz en el lenguaje MATLAB. MATLAB es fundamentalmente un programa para el cálculo matricial. Matrices Una matriz es, como el vector, una colección de elementos del mismo tipo. Sin embargo, mientras el vector es unidimensional —una sóla fila o columna— en la matriz los datos se organizan en dos o más dimensiones. Por ejemplo, a continuación tenemos una matriz M de dimensión 3x4 (3 filas x 4 columnas): 1 2 3 1 2 3 4 -5 3 6 4 2 3 1 10 -1 -2 -5 0 Para acceder a los elementos de una matriz n-dimensional necesitamos n índices. En el caso de la matriz anterior, para acceder a cualquiera de sus elementos debemos escribir el nombre de la matriz y entre paréntesis la fila y columna en la que está: matriz (fila, columna). Por ejemplo: M(3, 2), M(1, 4), etc. Definir matrices en MATLAB En MATLAB, se puede definir la matriz anterior M del siguiente modo: M = [-5, 4, 1, -2; 3, 2, 10, -5; 6, 3, -1, 0] Es decir, los elementos de cada fila se separan por puntos y comas. Mientras que los elementos de la misma fila están separados por comas (o espacios en blanco). MATLAB dispone de un gran número de funciones para construir matrices predefinidas. Se puede inicializar una matriz a ceros (todos los elementos son 0) mediante la función zeros. Por ejemplo: >> M=zeros(3) % inicializa a 0' s una matriz M = % cuadrada 3x3 0 0 0 0 0 0 0 0 0 >> A = zeros (3, 5) % inicializa a 0' s una A = % matriz 3x5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Se recomienda inicializar todas las matrices que se utilicen a ceros. También está predefinida la matriz identidad llamando a la función eye: >> eye(3) ans= 1 0 0 0 1 0 0 0 1 Otra función muy útil es size(mat). Esta función devuelve un vector con las dimensiones de la matriz. Por ejemplo, para las matrices anteriores M y A devolverá: >> [nfilasM, ncolsM]=size(M) nfilasM = 3 ncolsM = 3 >>[nfilasA, ncolsA]=size(A) nfilasA = 3 ncolsA = 5 Recorrido de un matriz Para recorrer una matriz necesitamos dos bucles anidados. Por ejemplo, si se desea recorrer todos los elementos de la matriz A por filas, se escribirán dos sentencias for anidadas: for i=1: nfilasA % para cada fila for j=1: ncolsA sentencias end end También es posible recorrer la matriz por columnas: for j=1: ncolsA % para cada columna for i=1: nfilasA sentencias end end O recorrer la matriz triangular superior de una matriz cuadrada: for i=1: nfilasM for j=i: ncolsM sentencias end end Y de forma similar para la triangular inferior. Ejercicio: ¿Qué instrucciones necesitaremos para escribir los elementos de la diagonal de una matriz cuadrada? ¿Son necesarios dos bucles? Ejercicios 1. Escribir una función que sume todos los elementos de una matriz numérica de tamaño n x m. 2. Escribir una función que devuelva la media de los elementos de una matriz numérica de tamaño n x m. 3. Un profesor quiere analizar los resultados de los exámenes que propone a sus alumnos. Cada alumno se examina 3 veces en un curso. Y en cada ocasión realiza dos tipos de examen: un test y uno de problemas. Por tanto, en total son 6 exámenes por alumno. a) Calcular la media por cada tipo de examen en cada convocatoria. La función debe devolver un vector con las 6 medias. b) Calcular la media por alumno. También se devolverá un vector con todas las medias. c) Escribir una función que indique el número de alumnos cuya nota media es superior a la media de todos los exámenes para todos los alumnos. Ejemplo de matriz para este ejercicio: Alu mno 1 2 3 4 5 6 7 8 9 10 T1 1 9.3 3.5 9.1 4.5 8.2 3.5 7.4 2.5 8.6 6.2 P1 2 4.8 5.2 8.6 5.6 7.0 5.2 3.5 3.5 7.1 3.7 exámenes T2 P2 3 4 5.3 6.9 5.9 7.5 5.6 8.4 6.0 6.5 7.9 9.5 4.5 6.5 6.5 5.4 4.3 3.1 9.4 6.5 4.5 6.9 T3 5 7.4 6.4 7.5 6.5 9.2 4.0 6.1 6.2 8.9 5.5 P3 6 8.8 3.9 6.9 8.0 9.4 6.0 6.5 4.1 7.5 5.5 En la página web de la asignatura tenéis un fichero de texto examen.txt' con estos datos que podéis utilizar. Para leer los datos ' del fichero en una matriz M, basta con escribir la instrucción: M= load (' nombre_fichero' ); 4. Tres en raya. Para jugar al 3 en raya se utiliza una matriz 3x3. Las casillas ocupadas por el primer jugador tienen un 1, las ocupadas por el segundo tienen un 2 y las que están libres un 0. a) Escribir una función que indique si el jugador 1 tiene "3 en raya" en horizontal. b) Escribir una función que indique si el jugador 1 tiene "3 en raya" en vertical. c) Escribir una función que indique si el jugador 1 tiene "3 en raya" en cualquiera de las dos diagonales del tablero. d) Utilizando las funciones anteriores, escribir una función que indique si el jugador 1 tienen 3 en raya (en cualquier posición). 5. Diseñar una función que multiplique dos matrices. Para ello, el número de columnas de la primera debe ser igual al número de filas de la segunda. La función debe mostrar un mensaje si esto no se cumple y, por tanto, no es posible realizar la multiplicación.