Motivación
En muchas aplicaciones, se requiere organizar un gran número de datos en un arreglo cuyos elementos se distingan por medio de dos o más subíndices.
Ejemplos:
Matrices (subíndices: renglón, columna)
Imágenes (subíndices: posición (x,y) de un pixel)
Video (subíndices: posición (x,y) y tiempo t)
Señales electrofisiológicas (EEG, EKG, fMRI)
Arreglos bidimensionales
Supongamos que nuestra aplicación requiere de arreglos organizados en forma de matriz, de manera que se haga referencia a cada elemento mediante dos subíndices.
En C/C++ existen dos técnicas para implementar este tipo de arreglos:
Arreglos de arreglos
Orden lexicográfico
Arreglos de arreglos
int x[M][N];
x[0]
x[1]
x[M-1]
Ejemplo: arreglos de arreglos
Suponga que se desea implementar un arreglo de M x N donde el elemento (i,j) sea igual a (i + j).
Solución #1: int i, j;int x[M][N];for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { x[i][j] = i + j; }}
Orden lexicográfico
int x[M*N];
x
Ejemplo: orden lexicográfico
int i, j;int x[M*N];for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { x[i*N+j] = i + j; }}
Arreglos bidimensionales como argumentos
void muestra(int x[][10], int m) {
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < 10; j++) {
cout << x[i][j] << " ";
}
cout << endl;
}
}
int main() {
int x[10][10];
int i, j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
x[i][j] = i + j;
}
}
imprime(x, 10);
}
void muestra(int x[], int m, int n) {
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
cout << x[i*n+j] << " ";
}
cout << endl;
}
}
int main() {
int x[10*10];
int i, j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
x[i*10+j] = i + j;
}
}
imprime(x, 10, 10);
}
Arreglos de arreglos
Orden lexicográfico
Comparación entre técnicas
Arreglos multidimensionales
También es posible utilizar arreglos de más de dos dimensiones; es decir, arreglos en los cuales los elementos estén indexados mediante mas de dos subíndices.
Ejemplo: arreglos tridimensionales
// Técnica: arreglo de arreglos
// Declaración
int x[M][N][P];
// Acceso al elemento (i,j,k)
x[i][j][k] = 0;
// Técnica: orden lexicográfico
// Declaración
int x[M*N*P];
// Acceso al elemento (i,j,k)
x[i*N*P + j*P + k] = 0;
Práctica
Las operaciones elementales de una matriz son:
Multiplicar el renglón i por una constante k.
Sumar al renglón i el renglón j multiplicado por k.
Intercambiar los renglones i y j.
Escriba tres funciones, una para cada operación elemental. Las funciones deben tomar como argumentos la matriz, sus dimensiones, y los parámetros requeridos para la operación.
Práctica
Utilizando las funciones anteriores, implemente en una función el método de Gauss-Jordan para encontrar la solución del sistema Ax = b. La función debe tomar A, b, y el tamaño del sistema n como argumentos:
Iniciar con c = 0 y r = 0.
Mientras c < n y r < n, hacer
Sea j = arg max i = r,…,n-1 {A(i,c)}
Si r es distinto de j, intercambiar renglones r y j.
Multiplicar el renglón r por 1/A(r,c)
Si A(r,c) es distinto de cero
Para cada renglón i = r + 1, …, n, sumar al renglón i el resultado de multiplicar el renglón r por –A(i,c).
Incrementar r.
Incrementar c.
Para r desde n-1 hasta 0,
Para cada renglón i = 0,…,r-1, sumar al renglón i el resultado de multiplicar el renglón r por –A(i,r).
Ejercicios
Elabore una función que realice el producto C = AB de dos matrices A de m x n y B de n x p. La función debe tomar como parámetros A, B, C, m, n y p.
Elabore una función que, dado el arreglo x[] de tamaño N, calcule el arreglo X[k] para k = 0,…,N-1, dado por:X[k] se conoce como la transformada discreta de Fourier (TDF) de x[n], y es una señal compleja la cual puede representarse como un arreglo de N x 2. Dada X[k], es posible recuperar x[n] mediante la transformada discreta inversa de Fourier (TDIF):Elabore una función que implemente la (TDIF) y verifique que ambas funciones son una inversa de la otra calculando el error cuadrático medio entre una señal de ruido aleatorio x[n], y la versión recuperada a partir de la TDIF de la TDF de x[n].
Ejercicios
Considere dos variables aleatorias X y Y, que pueden tomar valores entre 0 y K-1. El histograma conjunto hij de X y Y es una matriz que representa el número de veces que se observa simultáneamente X=i y Y=j en una muestra. Escriba una función que tome como argumentos los arreglos X y Y, ambos de tamaño N y con valores entre 0 y K-1, y calcule el histograma conjunto (de tamaño K x K).
La información mutua de dos variables aleatorias X y Y es una medida de qué tan fácil es predecir X cuando se conoce Y, y se calcula como I(X,Y) = H(X) + H(Y) – H(X,Y),donde H(X) es la entropía de X, y H(X,Y) es la entropía conjunta de X y Y, la cual puede calcularse a partir del histograma conjunto de X y Y como:donde pij = hij / N. Escriba una función que calcule la información mutua de dos arreglos.
Página anterior | Volver al principio del trabajo | Página siguiente |