Sunteți pe pagina 1din 4

ICOM2013 2do Parcial

25 de noviembre de 2013
Notas:
1. Al finalizar, enviar por e-mail los archivos fuente de cada
ejercicio con nombre APELLIDO_NOMBRE_Ejer_N.c a
icom@ib.cnea.gov.ar
2. Uso de prcticos: se pueden utilizar los trabajos prcticos
propios realizados.
3. Uso de Internet: solo para la consulta de referencias de
funciones de C.

Problema 1. Laberinto
La siguiente estructura de datos permite representar un laberinto
en trminos de caracteres ASCII, donde nf es el nmero de filas y nc
el nmero de columnas de la matriz de caracteres matlab. Dentro
de dicha matriz, las paredes infranqueables estn representadas por
+, los espacios por donde se puede circular con , la entrada por
E y la salida por S.
typedef struct {
int nf,nc;
char ** matlab;
} Laberinto_t;

+
+
+

+
+
+

+
+
+
+
+

+
+
+
+
+

+
+

+
+

+
+

+
+
+
+

+
+
+

+
+
+

S
+
+
+
+

Para resolver el laberinto (uniendo la entrada con la salida sin atravesar ninguna pared) contenido en el
archivo laberinto.txt (que contiene en la primera lnea el nmero de filas y columnas y luego la matriz de
caracteres) deber implementar las siguientes funciones:
// Crea y devuelve un nuevo laberinto de nf filas por nc columnas
Laberinto_t * CreaLaberinto(int nf, int nc);
// Destruye el laberinto l liberando toda la memoria asociada
void DestruyeLaberinto(Laberinto_t *l);
// Crea y devuelve un nuevo laberinto y inicalizado a partir del archivo de texto
Laberinto_t * IngresaLaberinto(const char * archivo);
// Setea el elemento (i,j) de la matriz de laberinto con c (retorno: 0 ok, -1 error)
int SetLaberintoElement(Laberinto_t *l, int i, int j, char c);
// Obtiene y retorna el elemento (i,j) del laberinto, en caso de error retorna -1
int GetLaberintoElement(Laberinto_t *l, int i, int j);
// Busca dentro de la matriz el elemento igual al caracter contenido en E y pone sus
// coordenadas en (piE,pjE). retornando 1 si lo encuentra y 0 sino.
int BuscaElementoLaberinto(Laberinto_t *l, char E, int * piE, int * pjE);
// Resuelve el laberinto l, a partir del elemento (i,j) colocando caracteres o para
// marcar el camino. Si logra llegar a la salida retorna 1, sino 0.
int ResuelveLaberinto(Laberinto_t *l, int i, int j);

// Imprime el laberinto l
void ImprimeLaberinto(Laberinto_t *l);
// crea retorna una nueva matriz de chars de nf filas por nc columnas.
char ** AllocaMatrizChar(int nf, int nc);
// libera la matriz creada por AllocaMatrizChar
void LiberaMatrizChar(char **m, int nf);

Con la ayuda de estas funciones, implemente un programa que resuelva el laberinto del archivo laberinto.txt,
marcando el camino entre la entrada (E) y la salida (S) con caracteres o

Problema 2. Almacenamiento de Matrices Ralas


Una matriz se denomina rala si la gran mayora de sus elementos son nulos. Hay varias formas de trabajar
con matrices ralas, adems de la vista en la Prctica. Consideremos una matriz rala A de Nrow filas y Ncol
columnas, con nnz elementos no nulos. Un formato sencillo de almacenamiento se denomina COO
(Coordinate Format), que consiste en utilizar la estructura
typedef struct{
int nnz;
// nmero de elementos no nulos de la matriz
float *Val; // Array de tamao nnz conteniendo los valores de la matriz
int *RowIdx; // Array de tamao nnz conteniendo los ndices de
// fila de los elementos de la matriz
int *ColIdx; // Array de tamao nnz conteniendo los ndices de
columna de los elementos de la matriz
} COOMatrix_t;

Por otra parte, existen varias representaciones ms compactas de una Matriz rala. Una de ellas se denomina
CSR (Compressed Sparse Row), que usa una estructura
typedef struct{
era numero de filas en el archivo (algo mas lgico)
int Nrow;
// nmero de elementos no nulos de la matriz
float *Val; // Array de tamao nnz conteniendo los valores de la matriz
int *csrRowIdx; // ver enunciado
int *ColIdx; // Array de tamao nnz conteniendo los ndices
//de columna de los elementos de la matriz
} CSRMatrix_t;

En este caso, csrRowIdx es un arreglo de enteros de tamao Nrow+1. El i-esimo elemento de este arreglo
contiene un ndice a los arreglos Val y ColIdx, apuntando al primer elemento no nulo de cada fila de la matriz,
mientras que el ltimo elemento de ColIdx es nnz. Por ejemplo, si
1.0 4.0 0
0
0
0 2.0 3.0 0
0
=
5.0 0
0 7.0 8.0
0
0 9.0 0 6.0
la representacin CSR es:
Val

= 1.0 4.0 2.0 3.0 5.0 7.0 8.0 9.0 6.0

csrRowIdx
ColIdx

= 0
= 0

2
1

4
1

7
2

9
0

Se desea construir una biblioteca para manejar matrices ralas, en cualquiera de estos formatos. Para ello,
implemente las siguientes funciones:
a) Manejo de matrices en representacin COO
// Inicializa una matriz en representacin COO
COOMatrix_t *IniciaCOOMatrix(int Nrow, int Ncol, int nnz);
// Inserta el elemento b en la posicin i,j en A.
void SetCOOMatrixElement(COOMatrix_t A, float b, int i, int j);
// Obtiene el elemento que se encuentra en la posicin i,j de A.
float GetCOOMatrixElement(COOMatrix_t A, int i, int j);

b) Manejo de matrices en representacin CSR


// Inicializa una matriz en representacin CSR
CSRMatrix_t *IniciaCSRMatrix(int Nrow, int Ncol, int nnz);
// Inserta el elemento b en la posicin i,j de A.
float GetCSRMatrixElement(CSRMatrix_t A, int i, int j);
// Obtiene el elemento b que se encuentra en la posicin i,j de A.
float GetCSRMatrixElement(CSRMatrix_t A, int i, int j);
// Devuelve un array con la diagonal de la matriz
float* GetCSRDiagonal(CSRMatrix_t A);

c) Transformaciones entre representaciones


// Dada una matriz COO, genera la representacin CSR de esa matriz
CSRMatrix_t* COO2CSRMatrix(COOMatrix_t);
// Dada una matriz CSR, genera la representacin COO de esa matriz
COOMatrix_t* CSR2COOMatrix(CSRMatrix_t);

Asuma que en cualquier representacin la matriz se llena y est ordenada por filas. Esto puede ser importante
a la hora de programar las funciones que ponen los elementos en la matriz. En SparseMatrix.h estn los
prototipos de estas funciones, y algunas funciones auxiliares tiles.

Problema 3. Correlacin entre imgenes:


En muchas aplicaciones de procesamiento de imgenes, es til identificar la presencia y ubicacin de
ciertos objetos o caractersticas conocidas en una imagen. Algunos ejemplos de este procesamiento
son la deteccin de rostros en una foto subida a una red social, la comparacin de huellas digitales
contra un banco de datos, etc.
Una manera simple de realizar la deteccin, consiste en correlacionar la imagen del objeto a detectar
(Iobj), de tamao m x n, con la imagen principal (Ippal) de tamao M x N.
La correlacin entre las dos imgenes se define como una nueva imagen (Icorr), de tamao (M-m) x
(N-n) donde los elementos vienen dados por:

La posicin del mximo de intensidad de Icorr indica la presunta posicin de Iobj en Ippal donde

valor absoluto de esa intensidad es una buena medida de la correlacin.


En el caso que Iobj claramente no est en Ippal, el mximo ser muy tenue. Para ello se suele definir
a priori que el objeto se encuentra en la imagen solo si el mximo de intensidad es mayor que un
valor de disparo definido por el usuario.
Utilizando la estructura para representar imgenes en escala de grises de la prctica 14, se solicita
implementar las siguientes funciones:
// Calcula la Imagen de correlacin
ImagenGris *correlacin( ImagenGris *Ippal, ImagenGris *Iobj);
// Calcular la posicin del objeto cuando supera el valor de
// disparo Threshold. Retorna 1 si hay imagen, 0 en caso contrario
int isObject( ImagenGris *Icorr, int *Xmax, int *Ymax, int Threshold)

S-ar putea să vă placă și