2009-05-15 10 views
3

Malheureusement, je n'ai pas beaucoup d'expérience en C++ et j'essaie de progresser moi-même en C++.Définir une matrice comme un tableau de tableaux et calculer sa matrice inverse en C++

Premièrement, I définie tableau de tableaux de telle sorte que I formé d'une matrice 3x3:

array< array<double>^ >^ input = gcnew array< array<double>^ >(3); 

for (j=0;j<input->Length;j++){ 
    input[j]=gcnew array<double>(3); 

J'affectés des éléments de matrice de réseau d'entrée de matrices:

int value=1; 
for(y=0;y<(3);y++){ 
    for(x=0;x<(3);x++) 
{input[y][x]=value; 
    value=value+1; 
    } 
    } 

Y at-il une fonction C++ qui calculer matrice inverse de ce tableau d'entrée de tableaux?

Pourriez-vous m'aider s'il vous plaît?

Cordialement ...

Répondre

0

Il n'y a pas de fonctions en C++ pour faire des opérations de la matrice, vous aurez besoin de trouver une bibliothèque pour le faire ou mettre en œuvre votre propre.

Notez que pour les tableaux de taille fixe, vous pouvez utiliser des tableaux de C/C++ régulière, comme celui-ci:

double arr[3][3]; 
0

Wikipédia a list of numerical libraries dans différents langages de programmation. Si les fonctions que vous recherchez ne sont pas disponibles, vous pouvez également envisager d'écrire une fonction wrapper autour d'une implémentation Fortran ou C ou C++ disponible.

+0

Je suis d'accord avec cela. Il y a un énorme corpus de code d'analyse linéaire, en grande partie dans Fortran, qui fera ce que vous voulez et il n'y a pas de meilleur endroit pour commencer à chercher que Lapack sur netlib.org. Je suggère également de ne pas utiliser le tableau de paradigmes de tableaux. La majeure partie du code externe s'attend à ce que le tableau soit un bloc de nombres convenablement mis en place dans l'ordre majeur d'une ligne ou d'une colonne. Créer ou trouver une classe avec un opérateur d'indexation approprié ne devrait pas être trop difficile. –

0

Il n'y a pas de fonction C++ intégrée pour effectuer une inversion de matrice (ou pour tout autre calcul de matrice).

Il y a beaucoup de méthodes pour l'inversion de la matrice mentionné HERE.

Si vous voulez l'efficacité et la facilité de mise en œuvre alors Guassian Elimination est probablement le meilleur.

code
0

pour l'utilisation inverse de la matrice de transformation de la ligne primaire en C++

#include<iostream> 
#include<stdio.h> 
#include<conio.h> 
using 
namespace std; 

float a[4][4];float b[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}}; 
int no = 4; 

int check(int k) { 
    float cont = 0, cont2 = 0; 
    for (int i = k; i < no; i++) { 
     if (a[i][k] == 1) { 
      for (int j = 0; j < no; j++) { 
       cont = a[i][j]; 
       cont2 = b[i][j]; 
       a[i][j] = a[k][j]; 
       b[i][j] = b[k][j]; 
       a[k][j] = cont; 
       b[k][j] = cont2; 
      } 
     } else if (a[i][k] == 0) { 
      for (int j = 0; j < no; j++) { 
       cont = a[i][j]; 
       cont2 = b[i][j]; 
       a[i][j] = a[no - 1][j]; 
       b[i][j] = b[no - 1][j]; 
       a[no - 1][j] = cont; 
       b[no - 1][j] = cont2; 
      } 
     } 
    } 
    return 0; 
} 

int divi(int k) { 
    float particular = a[k][k]; 
    for (int i = 0; i < no; i++) { 
     a[k][i] = a[k][i]/particular; 
     b[k][i] = b[k][i]/particular; 
     if (a[k][i] == (-0)) { 
      a[k][i] = 0; 
     } 
     if (b[k][i] == (-0)) { 
      b[k][i] = 0; 
     } 
    } 
    return 0; 
} 

int sub1(int k) { 
    float particular; 
    for (int j = k + 1; j < no; j++) { 
     particular = a[j][k]; 
     for (int i = 0; i < no; i++) { 
      a[j][i] = a[j][i] - (particular * a[k][i]); 
      b[j][i] = b[j][i] - (particular * b[k][i]); 
      if (a[j][i] == (-0)) { 
       a[j][i] = 0; 
      } 
      if (b[j][i] == (-0)) { 
       b[j][i] = 0; 
      } 
     } 
    } 
    return 0; 
} 

int sub2(int k) { 
    float particular; 
    for (int j = k - 1; j >= 0; j--) { 
     particular = a[j][k]; 
     for (int i = no - 1; i >= 0; i--) { 
      a[j][i] = a[j][i] - (particular * a[k][i]); 
      b[j][i] = b[j][i] - (particular * b[k][i]); 
      if (a[j][i] == (-0)) { 
       a[j][i] = 0; 
      } 
      if (b[j][i] == (-0)) { 
       b[j][i] = 0; 
      } 
     } 
    } 
    return 0; 
} 

int disp(){ 
cout<<endl; 
      for(int x=0;x<no;x++){ 
      for(int y=0;y<no;y++){ 
        if(a[x][y]==(-0)){a[x][y]=0;} 
        if(b[x][y]==(-0)){b[x][y]=0;} 
        printf("%0.1f|||%0.1f  ",a[x][y],b[x][y]); 
      } 
      cout<<endl;} 
} 

int main() 
{ 
    for(int i=0;i<no;i++){ 
      for(int j=0;j<no;j++){cout<<"Enter a["<<i<<"]["<<j<<"]";cin>>a[i}[j];} 
      } 
    for(int i=0;i<no;i++){ 
      for(int j=0;j<no;j++){cout<<a[i][j]<<" ";} 
    cout<<endl; 
      } 

    for(int i=0;i<no;i++){ 
     check(i); 
      disp(); 
     divi(i); 
      disp(); 
     sub1(i); 
      disp(); 
    } 
    for(int i=no-1;i>=0;i--){ 
    sub2(i); 
    disp(); 
    cout<<endl; 
    } 
    getch(); 
    getch(); 
    getch(); 
return 0;} 

} 
Questions connexes