Vous êtes sur la page 1sur 8

Matemticas (II): Matrices

Estoy seguro de que muchos de vosotros pensasteis lo mismo que yo cuando, aos atrs, estudiamos teora de matrices: "Y esto, para qu me sirve a m?". Pues mira por dnde, existe un campo donde son especialmente tiles: la programacin de grficos 3D. De hecho, constituyen una herramienta bsica que utilizaremos una y otra vez en nuestros desarrollos. En este captulo hablaremos sobre ellas: qu son y cmo utilizarlas para nuestros fines. Estaremos listos entonces para pasar posteriormente a hablar de las transformaciones en el Espacio.
Los Sistemas de Ecuaciones y las Matrices

Las manipulaciones de objetos en el Espacio se describen, como veremos ms adelante, a travs de ecuaciones. Dichas ecuaciones se componen de varias incgnitas. Encontrar la solucin para esas incgnitas, o dicho de otro modo: resolver las ecuaciones, nos permitir manipular los objetos. Dichas ecuaciones estn normalmente relacionadas unas con otras, y se agrupan formando lo que se conoce como Sistemas de Ecuaciones Lineales. Para poder resolver dichos sistemas, deben de existir tantas ecuaciones como incgnitas. Pueden existir sistemas sin solucin, sistemas con una solucin o sistemas con infinitas soluciones, aunque esto no nos interesa demasiado. Existen diferentes formas de resolver un sistema de ecuaciones, y uno de ellos es mediante el uso de Matrices. Las matrices son, adems, una herramienta muy til para nuestro trabajo con objetos y entidades en el Espacio, especialmente en espacio 3D, as que vamos a usarlas a menudo en programacin con OpenGL.
En realidad, a la hora de trabajar con OpenGL, lo que nos interesa son las tcnicas y operaciones que podemos realizar con matrices, ms que la resolucin en s de los sistemas de ecuaciones. De todos modos, desde el punto de vista de la Programacin Grfica en general, es interesante conocer cmo resolver dichos sistemas.

Una matriz es, simplemente, una coleccin de entidades (nmeros, variables, etc.) agrupados de forma ordenada, denominados elementos de la matriz. Cada matriz tiene unas determinadas dimensiones, que corresponden a su nmero de filas y de columnas, por ejemplo: 2x3, 2x2, 3x4, 10x15, etc. Asimismo, cuando una matriz tiene el mismo nmero de filas que de columnas (o sea, cuando sus dimensiones son iguales), se dice que es de orden n, siendo 'n' el numero de filas o columnas. Por ejemplo, una matriz de 3x3 sera de orden 3, una de 5x5 sera de orden 5, etc. Hay ms terminologa interesante en matrices, pero la iremos viendo conforme sea necesario.

Ahora, veamos un ejemplo prctico de resolucin de un sistema de ecuaciones sencillo mediante matrices. Por ejemplo, pongamos el siguiente sistema:
4x + 3 = 2y + z y + 2z = 7 + x 2x + 5 + z = 5y

Dicho sistema describe, de forma matemtica, un determinado problema al que debemos dar solucin. La solucin la obtendremos resolviendo los valores de las variables x, y, z. Valores que, a priori, no conocemos, y por eso a (x,y,z) las llamamos incgnitas. Vamos a reordenar las ecuaciones de forma que tengamos a la izquierda las variables con sus coeficientes, y a la derecha las constantes. Adems, las colocaremos de forma que las variables queden agrupadas por columnas:
4x - 2y - z = -3 -x + y + 2z = 7 2x - 5y + z = -5

Bien, ya tenemos el sistema listo para ser resuelto con matrices. Lo que vamos a hacer es lo siguiente: Primero, construimos una matriz con los coeficientes de las incgnitas, la "matriz de coeficientes", a la que llamaremos A:

A continuacin, creamos una matriz con las incgnitas, la "matriz de incgnitas", a la que llamaremos X:

Finalmente, construimos la "matriz de constantes", a la que llamaremos B:

Ahora, para resolver el sistema utilizaremos la expresin:


A X = B

O lo que es lo mismo:

Ahora debemos despejar la matriz de incgnitas. Para ello necesitamos conocer unos conceptos que vamos a ver ms adelante. Por el momento, basta con que sepas que la expresin final quedara as:
X = A-1 B

Es decir, para resolver en la prctica la matriz de incgnitas, tan slo tenemos que multiplicar la inversa de la matriz de coeficientes por la matriz de constantes. En operaciones con matrices no existe la Divisin como tal. Por eso necesitamos multiplicar por la matriz inversa de A en el caso expuesto arriba. Adems, no todas las matrices pueden ser invertibles, como veremos posteriormente. Pasemos ahora a ver las operaciones que podemos realizar con matrices.
Operaciones con Matrices

Para manipular y jugar con nuestras matrices, nos interesan en principio las siguientes operaciones: Suma/Resta, Multiplicacin (producto) e inversin (clculo de la matriz inversa). Tambin nos interesa conocer el concepto de la Matriz Identidad. Vamos con ello.

Suma y Resta de Matrices

Sumar y restar matrices es una operacin trivial, muy parecida a su anloga con nmeros o vectores. Eso s, debemos de tener en cuenta algo muy importante: las matrices involucradas en la operacin deben de tener las mismas dimensiones. Es decir, si vamos a sumar una matriz de 3x3 a otra, esta ltima debe de ser igualmente de 3x3. El resultado ser, obviamente, una nueva matriz de 3x3. El proceso se basa en realizar la operacin de suma/resta elemento por elemento, con su correspondiente en la otra matriz. Por ejemplo, si tenemos las matrices A y B, y queremos conocer la matriz C (resultado de la suma), la operacin A + B = C sera:
A | 2 | 5 3 | | 1 6 | + |-2 B 0 | | 2+1 4 | = | 5-2 3+0 | | 3 6+4 | = | 3 C 3 | 10 |

Dado que en lenguaje C podemos representar las matrices como arrays:


int matrizA[2][2] = { int matrizB[2][2] = { int matrizC[2][2]; {2, 3}, {5, 6} }; {8, 3}, {3, 10} };

El algoritmo de suma de matrices en cdigo podra ser algo as:


for (fila = 0; fila < 2; fila++) for (columna = 0; columna < 2; columna++) matrizC[fila][columna] = matrizA[fila][columna] + matrizB[fila][columna];

El de resta sera anlogo. Recuerda que si implementas un algoritmo de suma de matrices de dimensiones variables (no fijas, como en el ejemplo anterior), debes asegurarte de que todas tengan las mismas dimensiones antes de realizar la suma.
Producto de Matrices

La multiplicacin de dos matrices es una operacin algo ms complicada. Suerte que los ordenadores (o los dispositivos mviles programables) son especialmente eficientes a la hora de realizar operaciones complicadas. Lo nico que tenemos que hacer es decirles cmo realizar la operacin. No voy a explicar aqu el razonamiento terico del mtodo de multiplicacin, sino que iremos directos a la descripcin del mtodo, que es lo que nos interesa de cara a su implementacin en cdigo. El producto de matrices vamos a utilizarlo habitualmente en las Transformaciones, que como ya sabes usaremos para manipular los objetos en nuestro espacio. Adems, aprovecharemos una propiedad muy interesante de las matrices, que nos permitir

condensar diferentes transformaciones (traslacin, rotacin y escalado) en una sola matriz de transformacin. Pero esto lo veremos en el captulo correspondiente. Antes de explicar el mtodo de multiplicacin de dos matrices, cabe resaltar que, al igual que en el caso de los vectores, existe el denominado Producto de una matriz por un escalar. La operacin es anloga a la vista anteriormente para la Suma/Resta de matrices: simplemente multiplicamos cada elemento de la matriz por el escalar y obtenemos directamente la matriz resultante. La multiplicacin de dos matrices exige unos requisitos previos en cuanto a dimensiones de las matrices que van a formar parte de la operacin. Fjate en la Figura 8:

Figura 8: Requisitos previos para el producto de dos matrices

Es decir: para poder multiplicar dos matrices, el nmero de columnas de la primera (n) debe de ser igual al nmero de filas de la segunda (n). La matriz resultante tendr las siguientes dimensiones: Filas = nmero de filas de la primera (m), Columnas = nmero de columnas de la segunda (r). Con lo cual, podemos multiplicar por ejemplo A[4,3] * B[3,2] y obtendremos C[4,2]. Pero no podemos multiplicar A[3,2] * B[3,3]. El algoritmo de multiplicacin es el siguiente: Empezamos multiplicando cada elemento de la primera fila de A por el correspondiente en la primera columna de B, a continuacin los sumamos y as obtenemos el primer elemento de la primera fila de C. Continuamos multiplicando cada elemento de la primera fila de A por el correspondiente en la segunda columna de B, los sumamos y obtenemos as el segundo elemento de la primera fila de C.

Es un lo verdad?. Pues mejor lo vemos con una imagen, que quedar ms claro. Pongamos que queremos multiplicar dos matrices de tercer orden: A[3,3] B[3,3]. El resultado deber de ser una matriz C[3,3]. Fjate en la Figura 9, donde se explica el proceso de forma ms grfica:

Figura 9: Algoritmo del Producto de dos matrices

Ahora se ve ms claro no?. Quizs la mejor forma de entenderlo sea a travs de un ejemplo prctico. Pongamos dos matrices de segundo orden (2x2), para que los clculos sean ms sencillos:
A | 2 | 1 3 | | 5 2 | * | 3 B C 6 | | (2*5 + 3*3) (2*6 + 3*0) | | 19 12 | 0 | = | (1*5 + 2*3) (1*6 + 2*0) | = | 11 6 |

Imagino que con ese ejemplo queda mucho ms claro el procedimiento. Vamos a implementarlo en cdigo:
int matrizA[2][2] = {{2, 3}, {1, 2}}; int matrizB[2][2] = {{5, 6}, {3, 0}}; int matrizC[2][2] = {{0, 0}, {0, 0}}; int a, b, c; for(c = 0; c < 3; c++) { for(b = 0; b < 3; b++) { for(a = 0; a < 3; a++) { matrizC[c][b] += matrizA[c][a] matrizB[a][b]; } } }

Como ves, hemos implementado a traves de 3 bucles el algoritmo de multiplicacin comentado antes. Existen, no obstante, otros algoritmos alternativos que mejoran el rendimiento si se trata de matrices muy grandes. En nuestro caso, y para programacin grfica 3D, vamos a trabajar normalmente matrices de orden 3 y 4, es decir, de (3x3) y (4x4). Una propiedad importante de la multiplicacin de matrices es que, generalmente, no es conmutativa. Es decir, normalmente A B no es lo mismo que B A. Debes de tener esto presente. Hemos dicho anteriormente que no existe la divisin de matrices como tal, sino que debemos usar la multiplicacin por la matriz inversa. Veremos en unos momentos como calcular la inversa de una matriz, pero antes necesitamos conocer el concepto de la Matriz Identidad.
La Matriz Identidad

La matriz identidad es bsicamente el elemento neutro de la operacin de multiplicacin de matrices. El producto de una matriz A por la matriz identidad dar como resultado la misma matriz A original. Vendra a ser lo mismo que el "1" en la multiplicacin ordinaria de escalares. La matriz identidad se representa normalmente por "I", y a pesar de que hemos dicho que la multiplicacin de matrices NO es conmutativa generalmente, al multiplicar por la matriz identidad, s lo es:
A I = A = I A

La matriz identidad es siempre una matriz cuadrada: mismo nmero de filas que de columnas. Su caracterstica principal es que todos sus elementos son cero (0), excepto la diagonal principal que est constituida por unos (1):

Figura 10: Una matriz identidad de orden 3

Te propongo como ejercicio que realices a mano la multiplicacin de una matriz cualquiera de orden 2 por la matriz identidad del mismo orden. Te llevar menos de un minuto, y comprobars que el resultado es exactamente la matriz original. Y bien: Para qu puede sernos til esta matriz?. Pues vers: en OpenGL, las matrices por defecto de "model-view" y de proyeccin son matrices identidad. Hay tambin una operacin denominada Transformacin Identidad que

requiere del uso de esta matriz y que veremos ms adelante. Y, en general, nos puede venir bien el uso de matrices identidad en una serie de operaciones concatenadas, con las que obtendremos como resultado una matriz final de transformacin. No quiero adelantar materia, ya que esto forma parte del captulo de transformaciones, as que por el momento lo dejamos as.

Vous aimerez peut-être aussi