2016-05-25 9 views
1

Ich habe Probleme, den gesamten folgenden Code zu verstehen. Ich denke, dass der mittlere Abschnitt des Codes, den ich hervorhebe, eine Multiplikation durchführt, aber ich bin mir nicht sicher, kann mir bitte jemand erklären, was der mittlere Teil des Codes zu erreichen versucht?Matrixmanipulationscode, der unbekannte Operationen ausführt

Ich verstehe die Eingabe und Ausgabe Teile der Array-Elemente, aber nicht die tatsächlichen Manipulationen.

Ich verstehe dies:

#include "stdafx.h" 
    #include<iostream> 
    using namespace std; 
    int main() 
    { 
     int i,j,k,n; 
     float a[100][200],t; 
     cout<<"Enter order of matrix-"; 
     cin>>n; 
     cout<<"Enter elements of matrix"<<endl; 
     for(i=0;i<n;i++) 
      for(j=0;j<n;j++) 
      cin>>a[i][j]; 

Aber die folgenden Zeilen sind verwirrend:

 for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) 
      { 
       if(i==j-n) 
       a[i][j]=1; 
      else 
       a[i][j]=0; 
      } 
     } 
     for(i=0;i<n;i++) 
     { 
      t=a[i][i]; 
      for(j=i;j<2*n;j++) 
       a[i][j]=a[i][j]/t; 
      for(j=0;j<n;j++) 
      { 
      if(i!=j) 
      { 
       t=a[j][i]; 
       for(k=0;k<2*n;k++) 
        a[j][k]=a[j][k]-t*a[i][k]; 
       } 
      } 
     } 

Auch hier sind die folgenden Zeilen sind verständlich:

cout<<"\n\nInverse matrix\n\n"; 
     for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) 
      cout<<"\t"<<a[i][j]; 
      cout<<"\n"; 
     } 
    return 0; 
    } 

Antwort

0

Ihr Code versucht, zu invertieren eine Matrix. Hier ist, was der Code tut.

Unter der Annahme, dass Sie eine nxn Matrix A haben, können wir eine neue nx2n Matrix

B = AI

schaffen, in dem ich eine nxn Einheitsmatrix ist. Die Schaffung von B ist, was diese Linien zu tun versuchen: in einer dritten Matrix

for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) // makes sure you are only accessing columns in the right hand part of the matrix 
      { 
       if(i==j-n) 
       a[i][j]=1; 
      else 
       a[i][j]=0; 
      } 
     } 

Sie dann eine Reihe von Zeilenoperationen auf dieser 2n breiten Matrix durchführen, um die Identitätsmatrix auf der linken Seite zu erhalten resultierende

C = ID

, wo ich wieder die Matrix nxn Identität ist. Die Schaffung von C durch Zeilenoperationen ist, was dieser Teil des Codes zu tun versucht: (obwohl ich nicht mit der Korrektheit des Algorithmus sprechen werde, der verwendet wird, wie es eine Weile her ist, seit ich dies und typischerweise getan habe nur ein SVD-Algorithmus für Umkehrungen verwenden)

for(i=0;i<n;i++) //transform B matrix into C matrix 
     { 
      t=a[i][i]; 
      for(j=i;j<2*n;j++) 
       a[i][j]=a[i][j]/t; 
      for(j=0;j<n;j++) 
      { 
      if(i!=j) 
      { 
       t=a[j][i]; 
       for(k=0;k<2*n;k++) 
        a[j][k]=a[j][k]-t*a[i][k]; 
       } 
      } 
     } 

jetzt, wenn Sie erfolgreich die Zeilenoperationen abzuschließen und die Identitätsmatrix auf der linken Seite der C-Matrix erhalten, es stellt sich heraus, dass die nxn D-Matrix, die das macht rechtse Seite der C-Matrix ist das inverse von A, so dass wir

AD haben = I

weshalb das letzte Bit des Codes nur die rechte Seite von dem, was ich die C-Matrix nannte, ergreift.

das ist, was Ihr Code versucht zu tun. Wenn Sie mehr über die Theorie dahinter verstehen wollen, würde ich mir das Buch "Numerical Recipes in C" ansehen. Es ist der Goldstandard für diese Art von Dingen und frei online verfügbar. http://www.nrbook.com/a/bookcpdf.html

+0

Gibt es eine einfachere Methode, dies zu tun? – Ahmed

+0

nicht im Allgemeinen. Wenn Ihre Matrix 2x2 ist, können Sie etwas verwenden, das Cramer'sche Regel genannt wird, aber im Allgemeinen stecken Sie bei dieser oder "Singulärwertzerlegung" fest, um eine Pseudoinverse zu erhalten, die wesentlich komplizierter ist.Das Buch der numerischen Rezepte hat SVD, so dass Sie die Komplexität vergleichen können, wenn Sie möchten. –

Verwandte Themen