C'est programme qui calcule le pseudo-inverse de matrice
(Methode de Greville)
************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; }