Matrices Matrices Matrices Matrices

Anuncio
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
Descargar