Dev - C++ - Multiplicación de Matrices de distintas dimensiones.

   
Vista:
Imágen de perfil de Martin Larrosa

Multiplicación de Matrices de distintas dimensiones.

Publicado por Martin Larrosa martnahuel95@gmail.com (19 intervenciones) el 29/04/2016 05:34:32
Desde hace dias trato de encontrar el algoritmo para multiplicar matrices de distintas dimensiones (mxn) y (pxq) sé que n debe ser igual a q. A lo que quiero llegar es que sé cómo se multiplican las matrices sólo que no sé cómo codificar esto. Me vendría bien una ayuda, muchas gracias.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>
#include<windows.h>
 
				void carga(int f,int c,int M[][100]){
		for(int i=1;i<=f;i++){
			for(int j=1;j<=c;j++){
				printf("Posicion (%d,%d): ",i,j);
				scanf("%d",&M[i][j]);
			}
		}
	}
				void impresion(int f,int c,int M[][100]){
		for(int i=1;i<=f;i++){
			printf("\t");
			for(int j=1;j<=c;j++){
				printf(" %d ",M[i][j]);
			}
			printf("\n");
		}
	}
 
 
	int main(){
 
		int m=0,n=0;
			printf("Ingrese cuantas filas quiere para la matriz X: ");
			scanf("%d",&m);
			printf("Ingrese cuantas columnas quiere para la matriz X: ");
			scanf("%d",&n);
		int X[100][100];
			carga(m,n,X);
			printf("\n");
		int p=0,q=0;
			printf("Ingrese cuantas filas quiere para la matriz Z: ");
			scanf("%d",&p);
			printf("Ingrese cuantas columnas quiere para la matriz Z: ");
			scanf("%d",&q);
		int Z[100][100];
			carga(p,q,Z);
		system("cls");
					printf("La matriz X es: \n\n");
					impresion(m,n,X);
					printf("La matriz Z es: \n\n");
					impresion(p,q,Z);
		printf("\n\n\tMultiplicacion:\n\n");
			if(n==p){
				for(int i=1;i){
					for(){
					}
				}
			}else{
				printf("No se puede");
			}
 
 
 
 
 
 
	}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Multiplicación de Matrices de distintas dimensiones.

Publicado por agustin (311 intervenciones) el 29/04/2016 17:09:19
No entiendo bien lo que deseas hacer pero de momento el primer elemento de un array esta en la posición 0 y tu empiezas a contar desde la posición 1 con lo que no vas bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Martin

Multiplicación de Matrices de distintas dimensiones.

Publicado por Martin (19 intervenciones) el 29/04/2016 20:27:56
De momento este código carga dos matrices "X" y "Z" sin problemas, lo que quiero hacer es codificar la multiplicación de las matrices. Es fácil hacerlo cuando son dos matrices cuadradas... Pero si son de diferente orden ya no se me ocurre cómo hacerlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiplicación de Matrices de distintas dimensiones.

Publicado por Thanatos (73 intervenciones) el 30/04/2016 12:20:00
rsz_ecuacion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <stdlib.h>
 
void reservarMemoria(int***, unsigned, unsigned);
void cargarMatriz(int**, unsigned, unsigned);
void multiplicar(int**, int**, int**, unsigned, unsigned, unsigned);
void mostrarMatriz(int**, unsigned, unsigned);
void liberarMemoria(int***, unsigned);
 
int main() {
    unsigned m = 0;
    unsigned n = 0;
    unsigned p = 0;
 
    printf("Ingrese las dimensiones de las matrices:\n\nMatriz A\n");
    printf("filas -----> ");
    scanf("%u", &m);
    printf("columnas --> ");
    scanf("%u", &n);
    printf("\nMatriz B\nfilas -----> %u\n", n);
    printf("columnas --> ");
    scanf("%u", &p);
 
    int** matA;
    reservarMemoria(&matA, m, n);
    printf("\nIngrese los elementos de la matriz A:\n");
    cargarMatriz(matA, m, n);
 
    int** matB;
    reservarMemoria(&matB, n, p);
    printf("\nIngrese los elementos de la matriz B:\n");
    cargarMatriz(matB, n, p);
 
    int** matR;
    reservarMemoria(&matR, m, p);
 
    printf("\nMatriz A x B:\n");
    multiplicar(matA, matB, matR, m, n, p);
    mostrarMatriz(matR, m, p);
 
    liberarMemoria(&matA, m);
    liberarMemoria(&matB, n);
    liberarMemoria(&matR, m);
    return 0;
 }
 
void reservarMemoria(int*** array2D, unsigned filas, unsigned columnas) {
    *array2D = (int**) malloc(filas * sizeof(int*));
    for (unsigned i = 0; i < filas; ++i) {
        (*array2D)[i] = (int*) malloc(columnas * sizeof(int));
    }
}
 
void cargarMatriz(int** array2D, unsigned filas, unsigned columnas) {
    for (unsigned i = 0; i < filas; ++i) {
        for (unsigned j = 0; j < columnas; ++j) {
            printf("pos[%u, %u] = ", i + 1, j + 1);
            scanf("%d", &array2D[i][j]);
        }
    }
}
 
void multiplicar(int** A, int** B, int** R, unsigned m, unsigned n, unsigned p) {
    for (unsigned i = 0; i < m; ++i) {
        for (unsigned j = 0; j < p; ++j) {
            int suma = 0;
            for (unsigned k = 0; k < n; ++k) {
                suma += A[i][k] * B[k][j];
            }
            R[i][j] = suma;
        }
    }
}
 
void mostrarMatriz(int** array2D, unsigned filas, unsigned columnas) {
    for (unsigned i = 0; i < filas; ++i) {
        for (unsigned j = 0; j < columnas; ++j) {
            printf("%4d", array2D[i][j]);
        }
        printf("\n");
    }
}
 
void liberarMemoria(int*** array2D, unsigned filas) {
    for (unsigned i = 0; i < filas; i++) {
        free((*array2D)[i]);
    }
    free(*array2D);
    array2D = NULL;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Martin

Multiplicación de Matrices de distintas dimensiones.

Publicado por Martin (19 intervenciones) el 02/05/2016 16:43:58
No entiendo varias cosas en este código,
-Qué son los asteriscos antes y después de variables? por qué a veces lleva dos o tres?
-Qué hace la función sizeof?
-Qué es unsigned?
-Qué es malloc?
-Qué ocurre aquí?
1
*array2D = (int**) malloc(filas * sizeof(int*));
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Multiplicación de Matrices de distintas dimensiones.

Publicado por agustin (311 intervenciones) el 03/05/2016 22:35:22
Un asterisco se usa para punteros:
int a=5;
int *b=a;
En ese código la variable a vale 5 y la variable b es un puntero que apunta a la dirección de a. Si haces por ejemplo:
*b=1;
Y luego imprimes el valor de a veras que vale 1.
Si hay dos asteriscos es porque es un puntero a punteros.
sizeof no es una función, es una macro y lo que hace es devolver el tamaño del tipo indicado.
unsigned indica que es sin signo, o sea:
int acepta números positivos y negativos.
un signed int solo acepta 0 y positivos.
malloc es una función para solicitar memoria dinámica.
En lo último que preguntas lo que hace es solicitar memoria para almacenar tantos punteros como filas y devuelve la dirección del primero. Con eso ya tienes un puntero por fila pero necesitas asignar memoria para cada columna y es lo que hace después y se guarda cada dirección en cada puntero de fila. Si no has trabajado nunca con memoria dinámica es normal que ese código te desborde y más aún si no sabes lo que es un puntero. El tema de los punteros en C no es algo trivial, es muy importante y tienes que tenerlo muy claro así que deberías empezar a estudiartelo si quieres entender este código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Martin Larrosa

Multiplicación de Matrices de distintas dimensiones.

Publicado por Martin Larrosa (19 intervenciones) el 04/05/2016 00:45:33
Gracias Agustín, Voy a ponerme en campaña a estudiar todo lo referente a eso porque si, no tengo ni la más mínima idea de qué ocurre en ese código.. Gracias por su tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar