Universidad de Costa Rica
|
|
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 ) |
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 ) |
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 ) |
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 ) |
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 ) |
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 ) |
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
.
http://www.di-mare.com/adolfo/p/Matrix.htm
// 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.
Tiempo de entrega: | 1 semana | |
Modalidad: | En parejas |
Adolfo Di Mare <adolfo@di-mare.com>.
|