Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2011
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #2 [solución]

Matriz Chirrisquitica Tajadeada

     0  1  2  3  4  5  6             0  1  2  3  4  5  6
  +---+--+--+--+--+--+---+        +---+--+--+--+--+--+---+
0 | 10 11 12 13 14 15 16 |      0 | 10 11 12 13 14 15 16 |
1 | 17 18 19 20 21 22 23 | ==\  1 | 17 18 19 20 21 22 23 |
2 | ++ == == == == == == |    > 2 | 31 32 33 34 35 36 37 |
3 | 31 32 33 34 35 36 37 | ==/  3 | 38 39 40 41 42 43 44 |
4 | 38 39 40 41 42 43 44 |        +---+--+--+--+--+--+---+
  +---+--+--+--+--+--+---+
           5x7                            4x7
                     rowDel( 2, M, RES )
Almacena en RES[][] el resultado de eliminar la fila col de M[][].

      Hay mucha formas de reducirle el tamaño a una matriz. La más simple es eliminarle una fila completa, lo que le disminuye su dimensión, como se muestra en esta figura.

     0  1  2  3  4  5  6             0  1  2  3  4  5
  +---+--+--+--+--+--+---+        +---+--+--+--+--+---+
0 | 10 11 12 13 14 ++ 16 |      0 | 10 11 12 13 14 16 |
1 | 17 18 19 20 21 !! 23 | ==\  1 | 17 18 19 20 21 23 |
2 | 24 25 26 27 28 !! 30 |    > 2 | 24 25 26 27 28 30 |
3 | 31 32 33 34 35 !! 37 | ==/  3 | 31 32 33 34 35 37 |
4 | 38 39 40 41 42 !! 44 |      4 | 38 39 40 41 42 44 |
  +---+--+--+--+--+--+---+        +---+--+--+--+--+---+
           5x7                            5x6
                     colDel( 5, M, RES )
Almacena en RES[][] el resultado de eliminar la columna col de M[][].

      Quitar una columna también es muy sencillo, pero hay otras formas más interesantes de reducir el tamaño de la matriz original, como quitarle una diagonal completa. A primera vista parece que al quitar una diagonal o una trasdiagonal se se elimina una columna, pero también se puede eliminar una fila completa quitando diagonales.

     0  1  2  3  4             0  1  2  3  4             0  1  2  3
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+---+
0 | 10 11 12 13 14 |      0 | 10 11 12 // 14 |      0 | 10 11 12 14 |
1 | 15 16 17 18 19 |      1 | 15 16 // 18 19 |      1 | 15 16 18 19 |
2 | 20 21 22 23 24 | ==\  2 | 20 // 22 23 24 | ==\  2 | 20 22 23 24 |
3 | 25 26 27 28 29 |    > 3 | ++ 26 27 28 29 |    > 3 | 26 27 28 29 |
4 | 30 31 32 33 34 | ==/  4 | 30 .. 32 33 34 | ==/  4 | 30 32 33 34 |
5 | 35 36 37 38 39 |      5 | // 36 37 38 39 |      5 | 36 37 38 39 |
6 | 40 41 42 43 44 |      6 | 40 41 42 43 // |      6 | 40 41 42 43 |
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+---+
         7x5                       7x5                      7x4
                    colDel_sliceFromRow( 3, M, RES )
Almacena en RES[][] el resultado de eliminar una columna quitándole una tajada a M[][] a partir de row.

      Se puede eliminar el equivalente a una columna completa quitándole a la matriz original valores en diagonal. La cantidad de valores hay que eliminar es el número de filas de la matriz original; por eso, en este ejemplo, se continúa eliminando valores cuando se llega a la parte superior de la matriz. Los valores eliminados son sustituidos por el que aparece a la derecha.

     0  1  2  3  4             0  1  2  3  4             0  1  2  3  4
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+--+---+
0 | 10 11 12 13 14 |      0 | 10 11 12 // 14 |      0 | 10 11 12 18 14 |
1 | 15 16 17 18 19 |      1 | 15 16 // 18 19 |      1 | 15 16 22 23 19 |
2 | 20 21 22 23 24 | ==\  2 | 20 // 22 23 24 | ==\  2 | 20 26 27 28 24 |
3 | 25 26 27 28 29 |    > 3 | ++ 26 27 28 29 |    > 3 | 30 31 32 33 29 |
4 | 30 31 32 33 34 | ==/  4 | 30 31 32 33 34 | ==/  4 | 35 36 37 38 34 |
5 | 35 36 37 38 39 |      5 | 35 36 37 38 39 |      5 | 40 41 42 43 39 |
6 | 40 41 42 43 44 |      6 | 40 41 42 43 .. |        +---+--+--+--+---+
  +---+--+--+--+---+        +---+--+--+--+---+
         7x5                       7x5                        6x5
                    rowDel_sliceFromRow( 3, M, RES )
Almacena en RES[][] el resultado de eliminar una fila quitándole una tajada a M[][] a partir de row.

      El proceso de eliminar de la matriz original valores en diagonal hacia arriba también sirve para eliminar una columna. En este caso, la cantidad de valores hay que eliminar es el número de columnas la la matriz original y cada valor eliminado es son sustituidos por el que aparece debajo.

     0  1  2  3  4             0  1  2  3  4             0  1  2  3
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+---+
0 | 10 11 12 13 14 |      0 | 10 11 ++ 13 14 |      0 | 10 11 13 14 |
1 | 15 16 17 18 19 |      1 | 15 16 17 \\ 19 |      1 | 15 16 17 19 |
2 | 20 21 22 23 24 | ==\  2 | 20 21 22 23 \\ | ==\  2 | 20 21 22 23 |
3 | 25 26 27 28 29 |    > 3 | \\ 26 27 28 29 |    > 3 | 26 27 28 29 |
4 | 30 31 32 33 34 | ==/  4 | 30 \\ 32 33 34 | ==/  4 | 30 32 33 34 |
5 | 35 36 37 38 39 |      5 | 35 36 \\ 38 39 |      5 | 35 36 38 39 |
6 | 40 41 42 43 44 |      6 | 40 41 42 .. 44 |      6 | 40 41 42 44 |
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+---+
         7x5                       7x5                      7x4
                    colDel_sliceFromCol( 2, M, RES )
Almacena en RES[][] el resultado de eliminar una columna quitándole una tajada a M[][] a partir de col.

      Se puede usar la trasdiagonal para eliminarle una fila o una columna a la matriz original. De nuevo, para eliminar una columna la cantidad de valores que hay que remover es el número de filas de la matriz original. En lugar de avanzar hacia arriba removiendo valores, hay que avanzar hacia abajo, y si se llega al final de la matriz se continúa bajando desde la primera columna. Cada valor removido queda sustituido por el que tiene a la derecha.

     0  1  2  3  4             0  1  2  3  4             0  1  2  3
  +---+--+--+--+---+        +---+--+--+--+---+        +---+--+--+--+---+
0 | 10 11 12 13 14 |      0 | 10 11 ++ 13 14 |      0 | 10 11 17 13 14 |
1 | 15 16 17 18 19 |      1 | 15 16 17 \\ 19 |      1 | 15 16 22 23 19 |
2 | 20 21 22 23 24 | ==\  2 | 20 21 22 23 \\ | ==\  2 | 20 21 27 28 29 |
3 | 25 26 27 28 29 |    > 3 | \\ 26 27 28 29 |    > 3 | 30 26 32 33 34 |
4 | 30 31 32 33 34 | ==/  4 | 30 .. 32 33 34 | ==/  4 | 35 36 37 38 39 |
5 | 35 36 37 38 39 |      5 | 35 36 37 38 39 |      5 | 40 41 42 43 44 |
6 | 40 41 42 43 44 |      6 | 40 41 42 43 44 |        +---+--+--+--+---+
  +---+--+--+--+---+        +---+--+--+--+---+
         7x5                       7x5                        6x5
                    rowDel_sliceFromCol( 2, M, RES )
Almacena en RES[][] el resultado de eliminar una fila quitándole una tajada a M[][] a partir de col.

      Para eliminar una columna quitando valores de una trasdiagonal de la matriz origina hay que remover tantos valores como columans tenga la matriz original. En este caso, xada valor removido queda sustituido por el que tiene debajo.

      Su trabajo consiste en implementar las rutinas que le quitan tajadas a la matriz. Use la matriz chirrisquitica e incluya suficientes ejemplos BUnit.

Di Mare, Adolfo
Una Clase Matriz Chirrisquitica Escrita en C++, eporte Técnico ECCI-2004-02, Escuela de Ciencias de la Computación e Informática, Universidad de Costa Rica, 2004.
      http://www.di-mare.com/adolfo/p/Matrix.htm
Consulta:
Profe: ¿Cuáles son las funciones que tengo que implementar?
Respuesta:
// Retornan "true" si el valor de RES ha sido modificado
bool colDel( unsigned col, const Mat& M, Mat& RES );
bool rowDel( unsigned row, const Mat& M, Mat& RES );
bool colDel_sliceFromRow( unsigned row, const Mat& M, Mat& RES );
bool rowDel_sliceFromRow( unsigned row, const Mat& M, Mat& RES );
bool colDel_sliceFromCol( unsigned col, const Mat& M, Mat& RES );
bool rowDel_sliceFromCol( unsigned col, const Mat& M, Mat& RES );
bool rowDel_sliceFromRow( unsigned row, const Mat& M, Mat& RES );

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 1 semana
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2011
Derechos de autor reservados © 2011
[home] <> [/\]