Resstecias
Enviado por 55377951 • 9 de Julio de 2013 • 915 Palabras (4 Páginas) • 236 Visitas
C´odigo en C para multiplicar dos matrices 3x3.
V´ıctor Mun˜oz
9 de abril de 2006
1. Razonamiento te´orico.
Sean M,N ∈ M3:
M =
m00 m01 m02 m10 m11 m12 m20 m21 m22
N =
n00 n01 n02 n10 n11 n12 n20 n21 n22
Multiplic´andolas tendremos como resultado una matriz R ∈ M3:
R =
r00 r01 r02 r10 r11 r12 r20 r21 r22
Estudiando dicho producto elemento a elemento, obtenemos:
2 X
j=0
m0j · nji,∀i ∈ 0,1,2
m00 · n00 + m01 · n10 + m02 · n20 = r00 m00 · n01 + m01 · n11 + m02 · n21 = r01 m00 · n02 + m01 · n12 + m02 · n22 = r02
r0i
2 X
j=0
m1j · nji,∀i ∈ 0,1,2
m10 · n00 + m11 · n10 + m12 · n20 = r10 m10 · n01 + m11 · n11 + m12 · n21 = r11 m10 · n02 + m11 · n12 + m12 · n22 = r12
r1i
2 X
j=0
m2j · nji,∀i ∈ 0,1,2
m20 · n00 + m21 · n10 + m22 · n20 = r20 m20 · n01 + m21 · n11 + m22 · n21 = r21 m20 · n02 + m21 · n12 + m22 · n22 = r22
r2i
Estudiando las expresiones de los sumatorios, obtenidas por simple inspecci´on, obtenemos tres bucles, correspondientes a cada una de las tres filas de R (r0i, r1i, r2i). Tomando como ejemplo la primera fila (r0i),
2 X
j=0
m0j · nji,∀i ∈ 0,1,2
representar´ıa dos bucles anidados. El interno calcular´ıa cada elemento, por lo que dejar´ıamos “i” constante (tomando la forma general de un elemento de la primera fila de R, r0i, har´ıamos i = 0 para el primer elemento, i = 1 para el segundo e i = 2 para el tercero). El bucle quedar´ıa, por tanto:
1
Bucle interno for ( j = 0; j < 3; ++j ) { r [ 0 ] [ 0 ] += m[ 0 ] [ j ] ∗ n [ j ] [ 0 ] ; }
Para obtener el bucle externo tendremos en cuenta que lo que variamos en este caso es la “j”, desde 0 hasta 2. Nos queda:
Bucle externo for ( i = 0; i < 3; ++i ) { for ( j = 0; j < 3; ++j ) { r [ 0 ] [ i ] += m[ 0 ] [ j ] ∗ n [ j ] [ i ] ; } }
Por tanto, ya tenemos el c´odigo que calcula la fila 0 de la matriz R. Para calcular las dem´as variar´ıamos el ´ındice de fila de R en el rango [0,2]; adem´as, en la expresi´on moj ·nji, el ´ındice de fila de M es el que dice en qu´e fila de la matriz resultado estamos, luego tambi´en variar´a en dicho rango. Traduci´endolo a un bucle en C, tenemos el c´odigo definitivo:
Bucle definitivo for (k = 0; k < 3; ++k) { for ( i = 0; i < 3; ++i ) { for ( j = 0; j < 3; ++j ) { r [ k ] [ i ] += m[ k ] [ j ] ∗ n [ j ] [ i
...