Pseudo-inverse de matrice avec Methode de Greville en langage c


                                       



                      C'est programme qui calcule le pseudo-inverse de matrice 
             (Methode de Greville)
   


pseudo nverse de matrice







 ************Code source***********



#include <stdio.h>
#include <stdlib.h>
 ///Author: Karara Mohamed @ tutodev1.blogspot.com/
void lecture(double (*t)[50],int *lig,int *col)   /// cet fontion permet de lecture des élement de matrice
{
    int i,j;
    printf("\n\n");
    printf("\t Entrer la dimension  de matrice  A \n");
     printf("\n\n");
    printf("Donner nombre des ligne :");
    scanf("%d",lig);
    printf("Donner nombre des colone :");
    scanf("%d",col);
    for(i=0;i<*lig;i++)for(j=0;j<*col;j++)
                            {
                             printf("M[%d][%d]= ",i,j);
                             scanf("%lf",&t[i][j]);
                             }
}
int copare(double *t,int lig)   /// cet fonction premt de tester sur si le premier colonne null ou non
{
    int i,null=0;
    for(i=0;i<lig;i++)if(t[i]!=0)null++;
    if(null>0)return 1;
    else return 0;
}
void P_vecteur(double (*t)[50],int ligA,int ligQ,double *l,double *dk)
{
     int i,j,k;
     double s=0;
     for(i=0;i<ligA;i++){for(j=0;j<ligQ;j++)s+=t[i][j]*l[j];
                            dk[i]=s;
                            s=0;
                           }
                           }
void soust(double *t,double*l,int lig,double *c)
{
    int i;

    for(i=0;i<lig;i++)c[i]=t[i]-l[i];
}
void soust_Matrice(double (*t)[50],double(*l)[50],int lig,int col)
{
    int i,j;
    for(i=0;i<lig;i++)
    for(j=0;j<col;j++)t[i][j]=t[i][j]-l[i][j];
}
double vet_x_tvet(double *t,int lig)
{
    int s=0;
    int i;
    for(i=0;i<lig;i++)s+=(t[i]*t[i]);

    return s;
}
int main()
{

int lig,col,i,k=0,j,z;
double A[50][50],M[50][50],dk[50],c[50],b[50],dkb[50][50],Q[50],qqt,AD[50],DA[50];
lecture(M,&lig,&col);
for(i=0;i<lig;i++)Q[i]=M[i][k];
if(copare(Q,lig)==0){for(i=0;i<lig;i++)A[k][i]=0;}
else
{
    qqt=vet_x_tvet(Q,lig);
 for(i=0;i<lig;i++)A[k][i]=M[i][k]/qqt;
}
for(i=1;i<col;i++)
{
    for(j=0;j<lig;j++)Q[j]=M[j][i];

P_vecteur(A,i,lig,Q,dk);
P_vecteur(M,lig,i,dk,AD);

soust(Q,AD,lig,c);
if(copare(c,lig)==0){
   qqt=vet_x_tvet(dk,i);
   qqt+=1;
   P_vecteur(A,lig,i,dk,DA);
   for(j=0;j<lig;j++)b[j]=DA[j]/qqt;
 }

else{
qqt=vet_x_tvet(Q,lig);
for(j=0;j<lig;j++)b[j]=c[j]/qqt;
}
for(j=0;j<i;j++)for(z=0;z<lig;z++)dkb[j][z]=dk[j]*b[z];
soust_Matrice(A,dkb,i,lig);
for(j=0;j<lig;j++)A[i][j]=b[j];
printf("\n");
}
printf("\t Pseudo-inverse de matrice A est:\n");
printf("\n\n");
for(j=0;j<col;j++){printf("\t\t\t");for(z=0;z<lig;z++){printf("   %.1lf ",A[j][z]);}printf("\n");}///l'affichage de pseudo-invers
system("pause>>NULL");
    return 0;

}