Umkehrung einer Matrix in C++

Adnan Ashraf 15 Februar 2024
  1. Die Inverse einer Matrix
  2. C++-Implementierung von Inverse für eine 3x3-Matrix
Umkehrung einer Matrix in C++

Dieser Artikel erklärt die Matrix-Inverse und ihre Implementierung mit C++. Um die C++-Implementierung leicht zu verstehen, müssen wir zuerst das Konzept der Matrixinverse verstehen.

Die Inverse einer Matrix

Es gibt drei Schritte, um die Inverse der Matrix zu finden. Die Erklärung der Schritte ist unten angegeben.

  • Berechnen Sie im ersten Schritt die Determinante der gegebenen Matrix.
  • Berechnen Sie im zweiten Schritt den Adjungierten der gegebenen Matrix, wenn die Determinante ungleich Null ist.
  • Multiplizieren Sie abschließend die in Schritt 2 erhaltene Matrix mit 1/Determinante.

Mathematische Formel der Matrix Inverse

Sei S eine 3 x 3-Matrix. Dann ist die Formel, um ihre Umkehrung zu finden, unten angegeben.

$$ Invers\; von\; Matrix\; S\;= S^{-1}=\frac{1}{\operatorname{determinante}(S)} \operatorname{adjoint}(S) $$

Hinweis: Wir können die Inverse einer Matrix nicht finden, wenn die Determinante der gegebenen Matrix Null (0) ist, d. h. die Matrix singulär ist.

Unten ist ein Programm, um die Umkehrung einer Matrix der Ordnung 3x3 in C++ zu finden. Der Einfachheit halber haben wir ein Array zum Speichern der Matrix verwendet.

Das Programm findet die Inverse der Matrix nur, wenn sie nicht singulär ist. Wir können unsere Antwort anhand der folgenden Eigenschaft überprüfen.

$$ S.S^{-1}=I $$

Hier ist I die Identitätsmatrix mit dem Eintrag 1 in ihrer Diagonale. Wenn die obige Eigenschaft gilt, wird unsere Antwort wahr sein; andernfalls falsch.

Das vorgeschlagene Programm ist in Module gegliedert.

C++-Implementierung von Inverse für eine 3x3-Matrix

Die Matrixinverse kann unter Verwendung von Vektoren, Templates und Klassen implementiert werden. Der Einfachheit halber werden wir jedoch 2D-Arrays verwenden, um die Inverse einer 3x3-Matrix zu bestimmen.

Die Lösung kann dann verallgemeinert werden, um die Inverse der NxN-Matrizen zu finden.

Lassen Sie uns die Bestandteile des Programms einzeln erklären.

Hauptfunktion

int main()  // Hauptfunktion
{
  Float - Matrix3X3[3][3];
  int r, c;
  float Determinante = 0;
  for (r = 0; r < 3; r++) {
    for (c = 0; c < 3; c++) {
      cout << "Geben Sie den Wert bei Index [" << r << "][" << c << "] ein: ";
      cin >> matrix3X3[r][c];
    }
  }
  Anzeige(Matrix 3X3);
  Determinante = findDeterminant(matrix3X3);
  cout << "\n\nDeterminante der gegebenen Matrix ist : " << Determinante;
  if (determinante != 0) {
    adjungiert(matrix3X3);
    invers(matrix3X3, Determinante);
  }
  anders {
    cout << " Da die Determinante der gegebenen Matrix 0 ist, können wir nicht "
            "finden, dass es Invers ist:";
  }
}

In der Hauptfunktion haben wir die Matrix erstellt, deren Umkehrung gefunden werden soll. Dann haben wir bedingte Prüfungen angewendet, um festzustellen, ob die Matrix singulär ist oder nicht.

Wenn sie nicht singulär ist, wird die Inverse der Matrix nach Funktion berechnet. Hier ist die Erklärung jeder Funktion, die wir erstellt haben.

Anzeigefunktion

ungültige Anzeige(float matrix3X3[][3]) {
  printf("\nDie Elemente der Matrix sind:");
  for (int r = 0; r < 3; r++) {
    cout << "\n";
    for (int c = 0; c < 3; c++) {
      cout << matrix3X3[r][c] << "\t";
    }
  }
}

Die Anzeigefunktion wird verwendet, um eine Matrix anzuzeigen. Dabei ist matrix3X3 die Matrix, deren Werte angezeigt werden sollen.

Determinantenberechnungsfunktion

float findDeterminant(float matrix3X3[][3]) {
  float det = 0;  // hier ist det die Determinante der Matrix.
  for (int r = 0; r < 3; r++) {
    det = det + (matrix3X3[0][r] *
                 (matrix3X3[1][(r + 1) % 3] * matrix3X3[2][(r + 2) % 3] -
                  matrix3X3[1][(r + 2) % 3] * matrix3X3[2][(r + 1) % 3]));
  }
  gib det zurück;
}

Die Funktion findDeterminant wird verwendet, um die Determinante der Matrix zu finden. Dabei ist det die Determinante der Matrix matrix3X3.

Nachdem wir die Determinante gesehen haben, können wir schlussfolgern, ob die Matrixinverse möglich ist oder nicht.

Adjungierte Funktion

void adjoint(float matrix3X3[][3]) {
  cout << "\n\nAdjoint der Matrix ist: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}

Die Funktion adjungiert wird verwendet, um die Adjungierte der Matrix zu finden. Nachdem wir die adjungierte Matrix gefunden haben, multiplizieren wir sie mit dem Kehrwert der Determinante, um die Inverse zu finden.

Umkehrfunktion

void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nUmgekehrte Matrix ist: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}

Schließlich wird die inverse Funktion verwendet, um die Inverse der Matrix zu berechnen. In dieser Funktion wird jeder Eintrag der adjungierten Matrix durch die Determinante dividiert, um die Inverse der Matrix zu finden.

Sehen wir uns nun einen vollständigen Code der Umkehrung der 3x3-Matrix an.

Vollständiges C++-Programm

#include <iostream>
mit Namensraum std;
ungültige Anzeige(float matrix3X3[][3]) {
  printf("\nDie Elemente der Matrix sind:");
  for (int r = 0; r < 3; r++) {
    cout << "\n";
    for (int c = 0; c < 3; c++) {
      cout << matrix3X3[r][c] << "\t";
    }
  }
}
// Diese Funktion berechnet die Determinante der gegebenen Matrix
float findDeterminant(float matrix3X3[][3]) {
  float det = 0;  // hier ist det die Determinante der Matrix.
  for (int r = 0; r < 3; r++) {
    det = det + (matrix3X3[0][r] *
                 (matrix3X3[1][(r + 1) % 3] * matrix3X3[2][(r + 2) % 3] -
                  matrix3X3[1][(r + 2) % 3] * matrix3X3[2][(r + 1) % 3]));
  }
  gib det zurück;
}
// Diese Funktion berechnet den Adjungierten der gegebenen Matrix
void adjoint(float matrix3X3[][3]) {
  cout << "\n\nAdjoint der Matrix ist: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}
// Diese Funktion findet die Inverse der gegebenen Matrix
void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nUmgekehrte Matrix ist: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}
int main()  // Hauptfunktion
{
  Float - Matrix3X3[3][3];
  int r, c;
  float Determinante = 0;
  for (r = 0; r < 3; r++) {
    for (c = 0; c < 3; c++) {
      cout << "Geben Sie den Wert bei Index [" << r << "][" << c << "] ein: ";
      cin >> matrix3X3[r][c];
    }
  }
  Anzeige(Matrix 3X3);
  Determinante = findDeterminant(matrix3X3);
  cout << "\n\nDeterminante der gegebenen Matrix ist : " << Determinante;
  if (determinante != 0) {
    adjungiert(matrix3X3);
    invers(matrix3X3, Determinante);
  }
  anders {
    cout << " Da die Determinante der gegebenen Matrix 0 ist, können wir nicht "
            "finden, dass es Invers ist:";
  }
}

Ausgabe, wenn die Eingabematrix singulär ist:

Ausgabe für Singularmatrix

Die Ausgabe zeigt, dass unser Algorithmus die Inverse der Matrix nicht berechnet, wenn die Matrix singulär ist.

Ausgabe, wenn die Eingabematrix nicht singulär ist:

Ausgabe für nicht-singuläre Matrix

Die Ausgabe zeigt, dass unser Algorithmus die Inverse nur berechnet, wenn die Matrix nicht singulär ist.