Matrices Matrices conceptos Declaración También se llaman tablas o arrays bidimensionales Es un conjunto de valores de un mismo tipo (llamados elementos de la matriz). Cada elemento de la matriz se identifica por el nombre de la matriz y su posición (índices de fila y de columna). Todos los índices comienzan por el valor cero. Los elementos de la matriz se encuentran en posiciones de memoria contiguas. tipo nombre_matriz[ numero_filas ][ numero_columnas ]; Índices de fila: 0 hasta numero_filas - 1 Índices de columna: 0 hasta numero_columnas – 1 El tamaño de la fila viene dado por numero_columnas EJEMPLO: La matriz tiene 4 filas de 3 elementos float m[4][3]; 0 Matrices Fila 0 m[0][1] m[0][2] MEMORIA RAM Direcciones bajas m[1][0] Fila 1 m[1][1] m[1][2] m[2][0] Columnas Filas ... m[0][0] 1 Fila 2 2 0 m[0][1] m[0][2] m[0][3] 1 m[1][1] m[1][2] m[1][3] 2 m[2][1] m[2][2] m[2][3] 3 m[3][1] m[3][2] m[3][3] m[2][1] m[2][2] m[3][0] Fila 3 m[3][1] m[3][2] ... Direcciones altas Matrices Inicialización (1) Inicialización (2) tipo nombre_matriz[ numero_filas ][ numero_columnas ] = {valor, valor, ... }; Como máximo, deben aparecer tantos valores como elementos de la matriz: numero_filas x numero_columnas ... EJEMPLO: float m[4][3] = {-3, -2, -1, 0.5, 0.6, 0.7, 1, 1, 0, 10, 0, 5}; Fila 0 Fila 1 Columnas tipo nombre_matriz[ numero_filas ][ numero_columnas ] = { {valor, valor, ...}, {valor, valor, ...}, Valores de la fila 0 ... Valores de la fila 1 {valor, valor, ...} }; Valores de la fila numero_filas - 1 Filas 0 1 2 0 -3 -2 -1 1 0.5 0.6 0.7 2 1 1 0 3 10 0 5 Fila 2 Fila 3 m[0][0] -3 m[0][1] -2 m[0][2] -1 m[1][0] 0.5 m[1][1] 0.6 m[1][2] 0.7 m[2][0] 1 m[2][1] 1 m[2][2] 0 m[3][0] 10 m[3][1] 0 m[3][2] 5 ... Fundamentos de Informática. Dpto. de ATC - Página 1 de 4 Especialidades: Electrónica y Mecánica. Turno de Mañana. MEMORIA RAM Direcciones bajas Direcciones altas Matrices Matrices Acceso a los elementos (1) Acceso a los elementos (2) No se puede operar sobre todos los elementos de la matriz a la vez Sólo podemos acceder a los elementos de uno en uno Ejemplo: nombre_matriz[ índice_fila ][ índice_columna ] Cualquier expresión que de cómo resultado un valor entero #define M 3 #define N 4 void main() { EJEMPLOS: float x[M][N], y[M][N]; float a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12}; float b[M][N] = {12,11,10,9,8,7,6,5,4,3,2,1}; int f, c; m[ m[0][0] + 1 ][0] int m[3][2] = {1, -34, 0, 100, 3, 101}; int i = 5; m[ 1 + 1 ][0] m[i-3][1] = 3 * m[ m[0][0] + 1 ][0] + 4; m[3][0] = 10; if (m[2][1] > 50) { ... } scanf( “%d”, &(m[0][0]) ); m[2][0] ¡PELIGRO!: Se está accediendo fuera de la matriz: el último elemento es el m[2][1] NO y = a; x = a + b; SI for (f=0; f<M; f++) { for (c=0; c<N; c++) { y[f][c] = a[f][c]; x[f][c] = a[f][c] + b[f][c]; } } } Matrices Matrices Acceso a los elementos: ejemplo 1 Acceso a los elementos: ejemplo 2 Programa para imprimir una matriz por pantalla. #define M 3 #define N 4 void main() { int x[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12}; int f, c; for (f=0; f<M; f++) { for (c=0; c<N; c++) { printf( “%d “, x[f][c] ); } printf( “\n” ); } } 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 Programa para imprimir una matriz por pantalla columna a columna (cada columna de la matriz en una línea diferente). #define M 3 #define N 4 void main() { int x[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12}; int f, c; 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 for (c=0; c<N; c++) { for (f=0; f<M; f++) { printf( “%d “, x[f][c] ); } printf( “\n” ); } } Fundamentos de Informática. Dpto. de ATC - Página 2 de 4 Especialidades: Electrónica y Mecánica. Turno de Mañana. 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 Matrices Matrices Parámetros formales de tipo matriz Parámetros formales de tipo matriz: ejemplo 1a Al igual que los vectores, cuando usamos el nombre de una matriz sin corchetes, obtenemos la dirección de memoria donde comienza la matriz. Parámetros formales de tipo matriz No se reserva espacio en memoria para la matriz No es necesario indicar el tamaño de fila la matriz La dirección de memoria donde estará la matriz se le pasa en la llamada a la función Ejemplos de declaración: El tamaño de filas es opcional void funcion1( int tab[10][20] ); void funcion2( float mat[][20] ); El parámetro mat es una matriz de float’s que se encontrará en la dirección de memoria que se le pase en la llamada a funcion2. El tamaño de columnas es obligatorio El parámetro tab es una matriz de enteros que se encontrará en la dirección de memoria que se le pase en la llamada a funcion1. Matrices ... 0x100 void main() { float m1[M][N], m2[M][N]; ceros(m1); ceros(m2); } void ceros( float p[][N] ) { int i, j; for (i=0; i<M; i++) for (j=0; j<N; j++) p[i][j] = 0; } m1 void ceros( float p[][N] ) { int i, j; for (i=0; i<M; i++) for (j=0; j<N; j++) p[i][j] = 0; } El parámetro p toma la dirección de memoria de m1 0x100 p[0][0] p[0][1] ... P[9][4] m1[0][1] ... ... 0x138 ... m1[9][4] ... m2[0][0] 0x2F0 m2 m2[0][1] 0x2F4 ... ... 0x328 ... m2[9][4] ... Las casillas grises contienen valores desconocidos #define M 10 #define N 5 void ceros( float p[][N] ); Contenido 0 MEMORIA RAM Dirección 0 m1[0][1] ... ... ... 0x138 0 m1[9][4] ... 0x2F0 m2[0][0] 0x2F4 m2[0][1] ... 0x328 Contenido ... m1[0][0] 0x104 ... m1[0][0] 0x104 ... main() { float m1[M][N], m2[M][N]; ceros(m1); 0x100 ceros(m2); } Contenido Parámetros formales de tipo matriz: ejemplo 1c MEMORIA RAM Dirección Dirección Matrices Parámetros formales de tipo matriz: ejemplo 1b #define M 10 #define N 5 void ceros( float p[][N] ); MEMORIA RAM #define M 10 #define N 5 void ceros( float p[][N] ); ... m2[9][4] ... Las casillas grises contienen valores desconocidos main() { float m1[M][N], m2[M][N]; ceros(m1); ceros(m2); 0x2F0 } 0x100 void ceros( float p[][N] ) { int i, j; for (i=0; i<M; i++) for (j=0; j<N; j++) p[0][0] p[i][j] = 0; p[0][1] } ... El parámetro p toma la dirección de memoria de m2 Fundamentos de Informática. Dpto. de ATC - Página 3 de 4 Especialidades: Electrónica y Mecánica. Turno de Mañana. P[9][4] 0 m1[0][0] 0x104 0 m1[0][1] ... ... ... 0x138 0 m1[9][4] ... 0x2F0 0 m2[0][0] 0x2F4 0 m2[0][1] ... ... ... 0x328 0 m2[9][4] ... Matrices Matrices Ejemplo 1 Ejemplo 2 Función que calcula el producto de la diagonal secundaria de una matriz cuadrada. #define N 10 double prodsec( double matriz[N][N] ){ double prod = 1; int i = 0; int j = N-1; while (i<N) { prod = prod * matriz[i][j]; i++; j--; } return prod; } Aquí iría el código para inicializar la matriz m void main(){ double m[N][N]; ... printf( “%lf\n”, prodsec( m ) ); } Función para trasponer una matriz. La función tendrá dos parámetros, el primero debe ser la matriz original y el segundo debe ser la matriz donde se guardará la traspuesta. #define N 4 #define M 3 void trasponer( double m1[N][M], double m2[M][N] ) { int f, c; for ( f=0; f<N; f++) Matriz a for (c=0; c<M; c++) 1 2 3 m2[c][f] = m1[f][c]; } 6 7 8 9 10 11 12 void main() { double a[N][M] = {1,2,3,4,5,6,7,8,9,10,11,12}; double b[M][N]; trasponer( a, b ); Contenido de la matriz b después de ejecutar la función trasponer } Fundamentos de Informática. Dpto. de ATC - Página 4 de 4 Especialidades: Electrónica y Mecánica. Turno de Mañana. 4 5 Matriz b 1 5 9 2 6 10 3 7 11 4 8 12