• Jueves 14 de Noviembre de 2024, 23:02

Autor Tema:  Multiplicacion De Matrices?  (Leído 2484 veces)

MaLiGNo

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Multiplicacion De Matrices?
« en: Domingo 16 de Mayo de 2004, 12:58 »
0
Hola!
Tengo 2 matrices que cumplen con la regla de filas y columnas.

Como las multiplico?

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Multiplicacion De Matrices?
« Respuesta #1 en: Domingo 16 de Mayo de 2004, 14:42 »
0
mira a ver si esto te sirve


Código: Text
  1. void Multiply(int a[][MAX],int b[][MAX],int c[][MAX])
  2. {
  3. for(int i = 0; i < MAX; i++)
  4. for(int j = 0;j < MAX; j++)
  5. {
  6. c[i][j] = 0;
  7. for(int k = 0; k <MAX; k++)
  8.  
  9. c[i][j] += a[i][k] * b[k][j];
  10. }
  11. }
  12.  

lordford

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Multiplicacion De Matrices?
« Respuesta #2 en: Martes 18 de Mayo de 2004, 15:14 »
0
Hola, aqui otra vez !!!!

Puede ser mas sencillo y practico si lo divides en modulos o funciones mucho menos complejas, un consejo amigo para el trabajo con matrices: implementa un metodo que retorne una fila completa, otro que retorne una columna completa y uno que inserte un nuevo elemento en (x,y, ...), veras que sencilllo con solo hacer
llamadas reiteradas a estos metodos para la multiplicacion de filas por columnas completas, intentalo, es muy sencillo !!!!!!

Salu2,

 :hola:  :smartass:  :lol:

LordFord
~ Si quieres que algo en la vida te salga bien]~

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Multiplicacion De Matrices?
« Respuesta #3 en: Martes 18 de Mayo de 2004, 21:09 »
0
Hola.

Date cuenta de que la multiplicación de una fila por una columna es el producto escalar (o dot product, que dicen los anglosajones) de los vectores. Puedes hacer una función que te haga esto y te quedará más sencillo el código. Además, así ya tienes una función que calcule productos escalares por si algún día la necesitas.

Un saludo.

Ruben3d

Noel Solw

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Multiplicacion De Matrices?
« Respuesta #4 en: Miércoles 26 de Mayo de 2004, 02:01 »
0
La idea de de una funcion que reciba una fila de la primera matriza y una columna de la segunda y las multiplique, me parece muy interesante.
Yo como mandar una fila, pero no se como se arreglan para mandar, en forma efectiva, una columna.
Les estaria muy agradecido por vuestra respuesta.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Multiplicacion De Matrices?
« Respuesta #5 en: Miércoles 26 de Mayo de 2004, 12:33 »
0
Hola.

Sabiendo que en memoria la matriz se va a guardar linealmente, se puede definir la función que calcula el producto escalar de la siguiente manera:

Código: Text
  1. float productoEscalar(float *v1, int offset1, float *v2, int offset2, int size,);
  2.  

La función retorna el valor del producto escalar. La explicación de los parámetros es:
  • v1: Puntero al primer elemento del primer vector.</li>
  • offset1: Lo que hay que sumar al puntero para obtener el siguiente elemento.</li>
  • v2: Puntero al primer elemento del segundo vector.</li>
  • offset2: Lo que hay que sumar al puntero para obtener el siguiente elemento.</li>
  • size: Número de elementos en cada vector (dimensión).</li>
Con esta función, para multiplicar la tercera fila por la segunda columna de una matriz m de orden 4 se haría así:

Código: Text
  1. // Hay que recordar que el tamaño es [0,n-1]
  2. float resultado = productoEscalar(&m[2][0], 1, &m[0][1], n, n);
  3.  

De esta manera podemos elegir columnas, filas o vectores normales de igual manera, así que tenemos una función aplicable a muchos casos.

Un saludo.

Ruben3d

Noel Solw

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Multiplicacion De Matrices?
« Respuesta #6 en: Jueves 27 de Mayo de 2004, 18:12 »
0
Entendido (sin entrar a detalles), lo que tu haces es mandar un vector fila (o podrias hacerlo poniendo a para la matriz a[N][N] y luego, como no tienes acceso al vector columna, mandas la matriz (o casi toda) con la direccion de
a[0][j] correspondiente.
Lo que no comprendo por que dices que el codigo queda mas sencillo que el que propuso Franc.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Multiplicacion De Matrices?
« Respuesta #7 en: Jueves 27 de Mayo de 2004, 21:23 »
0
Hola.

Citar
mandas la matriz (o casi toda)

No mando la matriz, mando la dirección de memoria de un elemento. Mandar la matriz sería una gran sobrecarga.

Citar
Lo que no comprendo por que dices que el codigo queda mas sencillo que el que propuso Franc

Porque el algoritmo de multiplicar queda más claro (a mi forma de verlo, pero cada uno tiene su gusto):

Código: Text
  1. void Multiply(int a[][MAX],int b[][MAX],int c[][MAX])
  2. {
  3.     for (int i=0; i&#60;MAX; i++)        // Voy seleccionando filas de a
  4.         for (int j=0; j&#60;MAX; j++)    // Voy seleccionando columnas de b
  5.                                      // Multiplico fila i de a por columna j de b
  6.             c[i][j] = productoEscalar(&a[i][0], 1, &b[0][j], MAX, MAX);
  7. }
  8.  

Esta función se podría generalizar fácilmente para matrices que no fueran cuadradas, ya que ahora sólo multiplica matrices de orden MAX (por usar la misma declaración que franc, por motivos de comparación).

Yo veo más fácil de entender esta función para alguien que no sepa lo que hace el código, pero como ya he dicho, eso es cosa de cada uno.

Un saludo.

Ruben3d