Multiplikation zweier Matrizen in C

CBeginner
Jetzt üben

Einführung

In diesem Labor lernen Sie, wie man zwei Matrizen in C multipliziert. Das Labor umfasst die folgenden Schritte:

Lesen von Dimensionen und Elementen: Sie lernen, wie man die Dimensionen und Elemente zweier Matrizen über Benutzereingaben liest. Dieser Schritt stellt sicher, dass die Matrizen für die Multiplikation kompatibel sind.

Multiplikation von Zeilen und Spalten: Sie implementieren den Matrixmultiplikationsalgorithmus, bei dem jedes Element der Produktmatrix berechnet wird, indem die entsprechenden Zeilen und Spalten der Eingabematrizen multipliziert werden.

Ausgabe der Produktmatrix: Schließlich geben Sie die resultierende Produktmatrix aus.

Am Ende dieses Labors haben Sie ein solides Verständnis der Matrixmultiplikation in C und können diese auf verschiedene Anwendungen anwenden.

Dimensionen und Elemente einlesen

In diesem Schritt lernen Sie, wie Sie Matrixdimensionen und -elemente für die Matrixmultiplikation in C einlesen. Wir erstellen ein Programm, das es Benutzern ermöglicht, die Größe und die Werte zweier Matrizen einzugeben.

Erstellen Sie zunächst eine neue C-Datei für unser Matrixmultiplikationsprogramm:

cd ~/project
nano matrix_multiply.c

Fügen Sie nun den folgenden Code hinzu, um die Matrixdimensionen einzulesen:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;

    // Dimensionen der ersten Matrix einlesen
    printf("Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows1, &cols1);

    // Dimensionen der zweiten Matrix einlesen
    printf("Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows2, &cols2);

    // Überprüfen, ob die Matrizen multipliziert werden können
    if (cols1 != rows2) {
        printf("Matrixmultiplikation nicht möglich!\n");
        return 1;
    }

    printf("Die Matrixdimensionen sind für die Multiplikation gültig.\n");

    return 0;
}

Kompilieren und ausführen des Programms:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Beispielausgabe:

Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: 2 3
Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: 3 2
Die Matrixdimensionen sind für die Multiplikation gültig.

Zerlegung des Codes:

  • Wir definieren MAX_SIZE als 100, um die Matrixdimensionen zu begrenzen.
  • scanf() wird verwendet, um die Matrixdimensionen über die Benutzereingabe zu lesen.
  • Wir prüfen, ob die Matrixmultiplikation möglich ist, indem wir die Spalten der ersten Matrix mit den Zeilen der zweiten Matrix vergleichen.
  • Wenn die Dimensionen nicht kompatibel sind, gibt das Programm eine Fehlermeldung aus.

Ändern wir nun den Code, um die Matrixelemente einzulesen:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];

    // Dimensionen der ersten Matrix einlesen
    printf("Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows1, &cols1);

    // Dimensionen der zweiten Matrix einlesen
    printf("Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows2, &cols2);

    // Überprüfen, ob die Matrizen multipliziert werden können
    if (cols1 != rows2) {
        printf("Matrixmultiplikation nicht möglich!\n");
        return 1;
    }

    // Elemente der ersten Matrix einlesen
    printf("Geben Sie die Elemente der ersten Matrix ein:\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols1; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // Elemente der zweiten Matrix einlesen
    printf("Geben Sie die Elemente der zweiten Matrix ein:\n");
    for (int i = 0; i < rows2; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    printf("Matrizen wurden erfolgreich eingelesen.\n");

    return 0;
}

Kompilieren und ausführen des Programms:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Beispielausgabe:

Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: 2 3
Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: 3 2
Geben Sie die Elemente der ersten Matrix ein:
Geben Sie das Element [0][0] ein: 1
Geben Sie das Element [0][1] ein: 2
...
Matrizen wurden erfolgreich eingelesen.

Zeilen-Spalten-Multiplikation

In diesem Schritt lernen Sie, wie man die Matrixmultiplikation durch die Multiplikation von Zeilen der ersten Matrix mit Spalten der zweiten Matrix durchführt. Wir bauen auf dem vorherigen Code auf, um den Matrixmultiplikationsalgorithmus zu implementieren.

Aktualisieren Sie die Datei matrix_multiply.c, um die Matrixmultiplikationsfunktionalität hinzuzufügen:

cd ~/project
nano matrix_multiply.c

Ersetzen Sie den vorherigen Code durch die folgende Implementierung:

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];
    int result[MAX_SIZE][MAX_SIZE];

    // Dimensionen der ersten Matrix einlesen
    printf("Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows1, &cols1);

    // Dimensionen der zweiten Matrix einlesen
    printf("Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows2, &cols2);

    // Überprüfen, ob die Matrizen multipliziert werden können
    if (cols1 != rows2) {
        printf("Matrixmultiplikation nicht möglich!\n");
        return 1;
    }

    // Elemente der ersten Matrix einlesen
    printf("Geben Sie die Elemente der ersten Matrix ein:\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols1; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // Elemente der zweiten Matrix einlesen
    printf("Geben Sie die Elemente der zweiten Matrix ein:\n");
    for (int i = 0; i < rows2; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    // Matrizen multiplizieren
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            result[i][j] = 0;
            for (int k = 0; k < cols1; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }

    // Ergebnismatrix ausgeben
    printf("\nErgebnismatrix:\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Kompilieren und ausführen des Programms:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Beispielausgabe:

...
Ergebnismatrix:
58 64
139 154

Zerlegung des Matrixmultiplikationsalgorithmus:

  • Die äußeren beiden Schleifen i und j iterieren über die Ergebnismatrix.
  • Die innere Schleife k führt das Skalarprodukt der Zeile i der ersten Matrix und der Spalte j der zweiten Matrix aus.
  • result[i][j] wird berechnet, indem die Produkte der entsprechenden Elemente summiert werden.
  • Die verschachtelten Schleifen stellen sicher, dass jedes Element der Ergebnismatrix korrekt berechnet wird.

Wichtige Punkte zur Matrixmultiplikation:

  • Die Anzahl der Spalten in der ersten Matrix muss der Anzahl der Zeilen in der zweiten Matrix entsprechen.
  • Die resultierende Matrix hat die Dimensionen (Zeilen der ersten Matrix) × (Spalten der zweiten Matrix).

Ausgabe der Produktmatrix

In diesem letzten Schritt erweitern wir unser Matrixmultiplikationsprogramm um robustere Druckfunktionen und Fehlerbehandlung. Wir erstellen Funktionen zum Drucken von Matrizen und verbessern die Benutzerfreundlichkeit.

Aktualisieren Sie die Datei matrix_multiply.c mit der folgenden verbesserten Implementierung:

cd ~/project
nano matrix_multiply.c

Ersetzen Sie den vorherigen Code durch diese umfassende Version:

#include <stdio.h>

#define MAX_SIZE 100

// Funktion zum Drucken einer Matrix
void printMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, const char* matrixName) {
    printf("\n%s Matrix:\n", matrixName);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%5d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];
    int result[MAX_SIZE][MAX_SIZE];

    // Dimensionen der ersten Matrix einlesen
    printf("Geben Sie die Dimensionen der ersten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows1, &cols1);

    // Dimensionen der zweiten Matrix einlesen
    printf("Geben Sie die Dimensionen der zweiten Matrix (Zeilen Spalten) ein: ");
    scanf("%d %d", &rows2, &cols2);

    // Überprüfen, ob die Matrizen multipliziert werden können
    if (cols1 != rows2) {
        printf("Matrixmultiplikation nicht möglich!\n");
        printf("Die Spalten der ersten Matrix (%d) müssen den Zeilen der zweiten Matrix (%d) entsprechen.\n", cols1, rows2);
        return 1;
    }

    // Elemente der ersten Matrix einlesen
    printf("Geben Sie die Elemente der ersten Matrix ein:\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols1; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // Elemente der zweiten Matrix einlesen
    printf("Geben Sie die Elemente der zweiten Matrix ein:\n");
    for (int i = 0; i < rows2; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("Geben Sie das Element [%d][%d] ein: ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    // Eingabematrizen ausgeben
    printMatrix(matrix1, rows1, cols1, "Erste Eingabe");
    printMatrix(matrix2, rows2, cols2, "Zweite Eingabe");

    // Matrizen multiplizieren
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            result[i][j] = 0;
            for (int k = 0; k < cols1; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }

    // Ergebnismatrix ausgeben
    printMatrix(result, rows1, cols2, "Produkt");

    return 0;
}

Kompilieren und ausführen des Programms:

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Beispielausgabe:

...
Erste Eingabe Matrix:
    1     2     3
    4     5     6

Zweite Eingabe Matrix:
    7     8
    9    10
   11    12

Produkt Matrix:
   58    64
  139   154

Wichtige Verbesserungen in dieser Version:

  • Erstellte eine Funktion printMatrix(), um Matrizen mit konsistenter Formatierung auszugeben.
  • Hinzugefügt wurden aussagekräftigere Fehlermeldungen für die Kompatibilität der Matrixmultiplikation.
  • Gibt die Eingabematrizen aus, bevor die Produktmatrix angezeigt wird.
  • Verwendet %5d für die ausgerichtete Matrixausgabe.
  • Bietet ein übersichtliches und lesbares Ausgabeformat.

Erläuterung der Druckfunktion:

  • printMatrix() nimmt die Matrix, ihre Dimensionen und einen Namen als Parameter entgegen.
  • Verwendet verschachtelte Schleifen, um jedes Element auszugeben.
  • Der Formatbezeichner %5d stellt sicher, dass jede Zahl 5 Leerzeichen einnimmt, um die Ausrichtung zu gewährleisten.
  • Fügt nach jeder Zeile ein Zeilenumbruchzeichen hinzu, um die Lesbarkeit zu verbessern.

Zusammenfassung

In diesem Labor lernen Sie, wie Sie Matrixdimensionen und -elemente in C einlesen und anschließend eine Matrixmultiplikation durchführen. Zuerst lernen Sie, wie Sie die Dimensionen zweier Matrizen einlesen und prüfen, ob sie für die Multiplikation kompatibel sind. Anschließend lernen Sie, wie Sie die Elemente der beiden Matrizen einlesen und in zweidimensionalen Arrays speichern. Schließlich lernen Sie, wie Sie die eigentliche Matrixmultiplikation durchführen und die resultierende Produktmatrix ausgeben.