Multiplicar Dos Matrices en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a multiplicar dos matrices en C. El laboratorio cubre los siguientes pasos:

Lectura de Dimensiones y Elementos: Aprenderás a leer las dimensiones y los elementos de dos matrices a partir de la entrada del usuario. Este paso asegura que las matrices sean compatibles para la multiplicación.

Multiplicación de Filas por Columnas: Implementarás el algoritmo de multiplicación de matrices, donde cada elemento de la matriz producto se calcula multiplicando las filas y columnas correspondientes de las matrices de entrada.

Impresión de la Matriz Producto: Finalmente, mostrarás la matriz producto resultante.

Al finalizar este laboratorio, tendrás una sólida comprensión de la multiplicación de matrices en C y podrás aplicarla a diversas aplicaciones.

Lectura de Dimensiones y Elementos

En este paso, aprenderás a leer las dimensiones y los elementos de las matrices para la multiplicación de matrices en C. Crearemos un programa que permita a los usuarios introducir el tamaño y los valores de dos matrices.

Primero, creemos un nuevo archivo C para nuestro programa de multiplicación de matrices:

cd ~/project
nano matrix_multiply.c

Ahora, agrega el siguiente código para leer las dimensiones de la matriz:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int filas1, columnas1, filas2, columnas2;

    // Leer dimensiones de la primera matriz
    printf("Ingrese las dimensiones de la primera matriz (filas columnas): ");
    scanf("%d %d", &filas1, &columnas1);

    // Leer dimensiones de la segunda matriz
    printf("Ingrese las dimensiones de la segunda matriz (filas columnas): ");
    scanf("%d %d", &filas2, &columnas2);

    // Verificar si las matrices se pueden multiplicar
    if (columnas1 != filas2) {
        printf("¡La multiplicación de matrices no es posible!\n");
        return 1;
    }

    printf("Las dimensiones de las matrices son válidas para la multiplicación.\n");

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Salida de ejemplo:

Ingrese las dimensiones de la primera matriz (filas columnas): 2 3
Ingrese las dimensiones de la segunda matriz (filas columnas): 3 2
Las dimensiones de las matrices son válidas para la multiplicación.

Desglose del código:

  • Definimos MAX_SIZE como 100 para limitar las dimensiones de las matrices.
  • scanf() se utiliza para leer las dimensiones de la matriz desde la entrada del usuario.
  • Verificamos si la multiplicación de matrices es posible comparando las columnas de la primera matriz con las filas de la segunda matriz.
  • Si las dimensiones no son compatibles, el programa imprime un mensaje de error.

Ahora, modifiquemos el código para leer los elementos de la matriz:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int filas1, columnas1, filas2, columnas2;
    int matriz1[MAX_SIZE][MAX_SIZE];
    int matriz2[MAX_SIZE][MAX_SIZE];

    // Leer dimensiones de la primera matriz
    printf("Ingrese las dimensiones de la primera matriz (filas columnas): ");
    scanf("%d %d", &filas1, &columnas1);

    // Leer dimensiones de la segunda matriz
    printf("Ingrese las dimensiones de la segunda matriz (filas columnas): ");
    scanf("%d %d", &filas2, &columnas2);

    // Verificar si las matrices se pueden multiplicar
    if (columnas1 != filas2) {
        printf("¡La multiplicación de matrices no es posible!\n");
        return 1;
    }

    // Leer elementos de la primera matriz
    printf("Ingrese los elementos de la primera matriz:\n");
    for (int i = 0; i < filas1; i++) {
        for (int j = 0; j < columnas1; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matriz1[i][j]);
        }
    }

    // Leer elementos de la segunda matriz
    printf("Ingrese los elementos de la segunda matriz:\n");
    for (int i = 0; i < filas2; i++) {
        for (int j = 0; j < columnas2; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matriz2[i][j]);
        }
    }

    printf("Matrices leídas correctamente.\n");

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Salida de ejemplo:

Ingrese las dimensiones de la primera matriz (filas columnas): 2 3
Ingrese las dimensiones de la segunda matriz (filas columnas): 3 2
Ingrese los elementos de la primera matriz:
Ingrese el elemento [0][0]: 1
Ingrese el elemento [0][1]: 2
Ingrese el elemento [0][2]: 3
Ingrese el elemento [1][0]: 4
Ingrese el elemento [1][1]: 5
Ingrese el elemento [1][2]: 6
Ingrese los elementos de la segunda matriz:
Ingrese el elemento [0][0]: 7
Ingrese el elemento [0][1]: 8
Ingrese el elemento [1][0]: 9
Ingrese el elemento [1][1]: 10
Ingrese el elemento [2][0]: 11
Ingrese el elemento [2][1]: 12
Matrices leídas correctamente.

Multiplicación de Filas por Columnas

En este paso, aprenderás a realizar la multiplicación de matrices multiplicando las filas de la primera matriz con las columnas de la segunda matriz. Construiremos sobre el código anterior para implementar el algoritmo de multiplicación de matrices.

Actualiza el archivo matrix_multiply.c para agregar la funcionalidad de multiplicación de matrices:

cd ~/project
nano matrix_multiply.c

Reemplaza el código anterior con la siguiente implementación:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int filas1, columnas1, filas2, columnas2;
    int matriz1[MAX_SIZE][MAX_SIZE];
    int matriz2[MAX_SIZE][MAX_SIZE];
    int resultado[MAX_SIZE][MAX_SIZE];

    // Leer dimensiones de la primera matriz
    printf("Ingrese las dimensiones de la primera matriz (filas columnas): ");
    scanf("%d %d", &filas1, &columnas1);

    // Leer dimensiones de la segunda matriz
    printf("Ingrese las dimensiones de la segunda matriz (filas columnas): ");
    scanf("%d %d", &filas2, &columnas2);

    // Verificar si las matrices se pueden multiplicar
    if (columnas1 != filas2) {
        printf("La multiplicación de matrices no es posible!\n");
        return 1;
    }

    // Leer elementos de la primera matriz
    printf("Ingrese los elementos de la primera matriz:\n");
    for (int i = 0; i < filas1; i++) {
        for (int j = 0; j < columnas1; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matriz1[i][j]);
        }
    }

    // Leer elementos de la segunda matriz
    printf("Ingrese los elementos de la segunda matriz:\n");
    for (int i = 0; i < filas2; i++) {
        for (int j = 0; j < columnas2; j++) {
            printf("Ingrese el elemento [%d][%d]: ", i, j);
            scanf("%d", &matriz2[i][j]);
        }
    }

    // Multiplicar matrices
    for (int i = 0; i < filas1; i++) {
        for (int j = 0; j < columnas2; j++) {
            resultado[i][j] = 0;
            for (int k = 0; k < columnas1; k++) {
                resultado[i][j] += matriz1[i][k] * matriz2[k][j];
            }
        }
    }

    // Imprimir la matriz resultado
    printf("\nMatriz Resultado:\n");
    for (int i = 0; i < filas1; i++) {
        for (int j = 0; j < columnas2; j++) {
            printf("%d ", resultado[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Salida de ejemplo:

Ingrese las dimensiones de la primera matriz (filas columnas): 2 3
Ingrese las dimensiones de la segunda matriz (filas columnas): 3 2
Ingrese los elementos de la primera matriz:
... (elementos de la matriz)
... (elementos de la matriz)

Matriz Resultado:
58 64
139 154

Desglose del algoritmo de multiplicación de matrices:

  • Los dos bucles exteriores i y j iteran a través de la matriz resultado.
  • El bucle interior k realiza el producto punto de la fila i de la primera matriz y la columna j de la segunda matriz.
  • resultado[i][j] se calcula sumando los productos de los elementos correspondientes.
  • Los bucles anidados garantizan que se calcule correctamente cada elemento de la matriz resultado.

Puntos clave sobre la multiplicación de matrices:

  • El número de columnas en la primera matriz debe ser igual al número de filas en la segunda matriz.
  • La matriz resultante tendrá dimensiones (filas de la primera matriz) × (columnas de la segunda matriz).

Imprimir la Matriz Producto

En este paso final, mejoraremos nuestro programa de multiplicación de matrices agregando una funcionalidad de impresión más robusta y manejo de errores. Crearemos funciones para imprimir matrices y mejoraremos la experiencia general del usuario.

Actualiza el archivo matrix_multiply.c con la siguiente implementación mejorada:

cd ~/project
nano matrix_multiply.c

Reemplaza el código anterior con esta versión completa:

#include <stdio.h>

#define MAX_SIZE 100

// Función para imprimir una matriz
void printMatrix(int matrix[MAX_SIZE][MAX_SIZE], int filas, int columnas, const char* nombreMatriz) {
    printf("\n%s Matriz:\n", nombreMatriz);
    for (int i = 0; i < filas; i++) {
        for (int j = 0; j < columnas; j++) {
            printf("%5d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int filas1, columnas1, filas2, columnas2;
    int matriz1[MAX_SIZE][MAX_SIZE];
    int matriz2[MAX_SIZE][MAX_SIZE];
    int resultado[MAX_SIZE][MAX_SIZE];

    // Leer dimensiones de la primera matriz
    printf("Ingrese las dimensiones de la primera matriz (filas columnas): ");
    scanf("%d %d", &filas1, &columnas1);

    // Leer dimensiones de la segunda matriz
    printf("Ingrese las dimensiones de la segunda matriz (filas columnas): ");
    scanf("%d %d", &filas2, &columnas2);

    // Verificar si las matrices se pueden multiplicar
    if (columnas1 != filas2) {
        printf("La multiplicación de matrices no es posible!\n");
        printf("Las columnas de la primera matriz (%d) deben ser iguales a las filas de la segunda matriz (%d).\n", columnas1, filas2);
        return 1;
    }

    // Leer elementos de la primera matriz
    printf("Ingrese los elementos de la primera matriz:\n");
    // ... (código para leer la matriz 1)

    // Leer elementos de la segunda matriz
    printf("Ingrese los elementos de la segunda matriz:\n");
    // ... (código para leer la matriz 2)

    // Imprimir matrices de entrada
    printMatrix(matriz1, filas1, columnas1, "Primera Entrada");
    printMatrix(matriz2, filas2, columnas2, "Segunda Entrada");

    // Multiplicar matrices
    // ... (código para multiplicar matrices)

    // Imprimir matriz resultado
    printMatrix(resultado, filas1, columnas2, "Producto");

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Salida de ejemplo:

... (entrada de datos)

Primera Entrada Matriz:
    1     2     3
    4     5     6

Segunda Entrada Matriz:
    7     8
    9    10
   11    12

Matriz Producto:
   58    64
  139   154

Mejoras clave en esta versión:

  • Se creó una función printMatrix() para imprimir matrices con formato consistente.
  • Se agregaron mensajes de error más descriptivos para la compatibilidad de la multiplicación de matrices.
  • Se imprimen las matrices de entrada antes de mostrar la matriz producto.
  • Se utiliza %5d para la impresión alineada de la matriz.
  • Se proporciona un formato de salida claro y legible.

Explicación de la función de impresión:

  • printMatrix() recibe la matriz, sus dimensiones y un nombre como parámetros.
  • Utiliza bucles anidados para imprimir cada elemento.
  • El especificador de formato %5d asegura que cada número ocupe 5 espacios para la alineación.
  • Se agrega un salto de línea después de cada fila para una mejor legibilidad.

Resumen

En este laboratorio, aprenderás cómo leer las dimensiones y los elementos de una matriz, y luego realizar la multiplicación de matrices en C. Primero, aprenderás a leer las dimensiones de dos matrices y verificar si son compatibles para la multiplicación. Luego, aprenderás a leer los elementos de las dos matrices y almacenarlos en matrices bidimensionales. Finalmente, aprenderás cómo realizar la multiplicación de matrices propiamente dicha e imprimir la matriz producto resultante.