Matrice réelle avec programme en C sous unix

Fermé
rima.rim - Modifié par mamiemando le 10/06/2015 à 07:23
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 10 juin 2015 à 07:27
Bonjour,

j'ai développé un programme écrit en C concernant le produit de deux matices (la première est creuse alorsque la deuxième est dense) ces matrices sont générées aléatoirement (voir l'algorithme ci-dessous),mon problème c'est que je dois tester ce meme programme avec une matrice réelle de "matrix market", j'ai télèchargé un fichier contenant un exemple de matrice réelle,mais je ne connais pas comment se fait la modification au niveau du code pour que notre programme doit exécuter correctement des matrices réelles au lieu des matrices générées aléatoirement ? je vous rappel que le test est sur le terminal unix de mon PC.

#include<stdio.h>
#include<stdlib.h>
//#include<conio.h>
#include<math.h>
#include<time.h>
//#include <iostream.h>
//#include <fstream.h>
#define max1 100
#define seed 1000
/***********************************************  Fonction Generateur_Dense  *********************************/


void Dense(long int N,double *B)

{
    long int i,j,signe;
    //printf("entree gen\n");
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
        {   printf("B[%ld,%ld]=", i,j);
            scanf("%lf",&B[i*N+j]);


        }
}
/*Cette fonction permet de générer une matrice dense*/

void generateur_Dense(long int N,double *B)

{
    long int i,j,signe;
    //printf("entree gen\n");
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
        {
            B[i*N+j]=(double)(RAND_MAX/(rand()+1));
            signe=rand();
            if(signe<(RAND_MAX/2))
                B[i*N+j]*=(-1);

        }
    //printf("sortie gen\n");
}
/***********************************************  Fonction Generateur_MatriceDNS  *********************************/

/*Cette fonction permet de générer aléatoirement une matrice quelconque.*/

void generateur_MatriceDNS(long int N,unsigned long int NNZ,double *A)
{
    unsigned long int i,z,j,signe,x,y,d,max,min;

    /*Mise à zéro de la matrice*/
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
        {
            A[i*N+j]=0;
        }
    /*On génére, d'abord,tous les éléments de la diagonale de la matrice aléatoirement
      afin d'éviter des lignes ou des colonnes vides.*/
    for(i=0;i<N;i++)
    {
        A[i*N+i]=(double)RAND_MAX/(rand()+1);
        signe=rand();
        if(signe<(RAND_MAX/2))
            A[i*N+i]*=(-1);

    }
    /*Génération de la matrice.*/
    d=NNZ-N;/*calcul du nombre d'éléments non nuls restants*/
    for(z=0;z<d;z++)
        /*Répéter la génération NNZ fois(Nombre d'élèments non nuls)- N fois(Nombre d'éléments déjà placé à la diagonale).*/
    { do
        {/*Générer des indices colonnes et des indices lignes dont l'élèment correspondant
           est nul pour éviter la génération du même élément plusieurs fois  */
            i=(int)(((float)rand()/RAND_MAX)*(N-1));
            j=(int)(((float)rand()/RAND_MAX)*(N-1));
        } while(A[i*N+j]!=0);

        /*Génération de l'élèment ayant les indices générés.*/
        A[i*N+j]=((double)RAND_MAX)/(rand()+1);
        signe=rand();
        if(signe<(RAND_MAX/2))
            A[i*N+j]*=(-1);
    }
}


void affiche(long int N,double *P)
{
    long int i,j;
    for (i=0;i<N;i++)
        for (j=0;j<N;j++)
        {
            printf("p[%ld,%ld]=%f ",i,j,P[i*N+j]);
            printf("\n");
        }
}


void init(long int N,double *P)
{
    long int i,j;
    for (i=0;i<N;i++)
        for (j=0;j<N;j++)
        {
            P[i*N+j]=0;
        }
}


//********************* DNS CD

void produit_DNS_CD_IKJ_V2(long int N,double  *A,double  *B, double  *C, double  *t1 )
{
    long int i,j,k,m,ne;
    double s;
    m=N%2;
    ne=N-m;
    clock_t a = clock();
    //printf("****\n");
    //printf("m=%ld,ne=%ld \n",m,ne);
    for (i=0;i<N;i++)
        for (k=0;k<N;k++)

            for (j=0;j<ne;j=j+2)
            {
                s=A[i*N+k];
                C[i*N+j]=0;
                if(s!=0)
                    C[i*N+j]= C[i*N+j] + s * B[k*N+j] +C[i*N+(j+1)] + s * B[k*N+(j+1)]  ;


            }

    for (j=ne;j<N;j++)
    {
        s=A[i*N+k];

        if(s!=0)
            C[i*N+j]=C[i*N+j] + s * B[k*N+j] ;
    }
    clock_t b = clock();


    *t1=(double)((b-a)/CLOCKS_PER_SEC);
}

void enreg_matrice_fichier(long int N, double *b, FILE* fp)
{
    int i, j, k;

    //************************************
    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            fprintf(fp,"%.3f |",b[i*N+j]);
        }
        fprintf(fp,"\n");
    }
    fprintf(fp,"\n");
}


void enreg_matrice_fichier2(long int N, double b[max1][max1], FILE* fp)
{
    int i, j, k;

    //************************************
    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            fprintf(fp,"%.3f |",b[i][j]);
        }
        fprintf(fp,"\n");
    }
    fprintf(fp,"\n");
}

void enreg_res_fichier(long int N,int densite, double *t, FILE* fp)
{
    fprintf(fp,"%ld %d ",N,densite);
    fprintf(fp," %.2lf     ",*t);
    fprintf(fp,"\n");
}
void enreg_res_fichier2(long int N,int densite, double *t, FILE* fp)
{
    fprintf(fp," %.2lf     ",*t);
}
/*void videRAM()
  {
  double v [100]={0};
  for (int i; i<100; i++)
  v[i]=rand();
  }*/

/*********************fonction main()************************/

double *A,*B,*C,*A1;
long int N;
unsigned long  int NNZ;
int densite;
//time_t t,t1;
int i,k,j,g,x;
char nomf[30]="";
int DD[max1]={0};
long int NN [max1]={0};
double t ;
FILE  * fres;


main()
{
    // clrscr();

    for (i=1; i<7; i++)
        NN[i]=i*1000;
    for (i=1; i<6; i++)
        DD[i]=i*10;
    DD[0]=5;

    for (i=1; i<7; i++)
        for (j=0; j<6; j++)
        {

            N= NN[i];
            densite= DD[j];
            NNZ=(densite*N*N)/100;

            B=(double *)malloc(N*N*sizeof(double));
            A=(double *)malloc(N*N*sizeof(double));
            C=(double *)malloc(N*N*sizeof(double));

            srand(seed);
            generateur_Dense(N,B) ;
            generateur_MatriceDNS(N,NNZ,A);
            /*videRAM();
              init(N,C);
              produit_DNS_CD_IKJ_V2 ( N,A,B, C,&t );


              fres=fopen("resDNS_IKJv2.txt","a+");
              fprintf(fres,"%ld %d ",N,densite);
              enreg_res_fichier2( N,densite,&t , fres);
              fclose(fres);
              printf(" ijk 4\n");
              videRAM();*/


            init(N,C);
            produit_DNS_CD_IKJ_V2( N,A,B, C,&t );
            fres=fopen("resDNS_IKJv2.txt","a+");
            enreg_res_fichier( N,densite,&t, fres);

            fclose(fres);



            free(B);
            free(A);
            free(C);

        }
    getchar() ;

}
A voir également:

1 réponse

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
10 juin 2015 à 07:27
Tout ce qui est entre l'allocation de A et B puis l'appel de produit_DNS_CD_IKJ_V2 correspond à leur initialisation. C'est donc ça que tu dois changer.

Pour lire un fichier et charger ta matrice tu devras sans doute utiliser les fonctions fopen, fscan, fclose... Je te conseille dans un premier temps d'écrire un programme à part, qui lit cette matrice et l'affiche. Quand ce sera fait tu pourras facilement ajouter cette fonction au programme que tu nous a montré.

Mais en tout cas, avant de te lancer là dedans, je t'invite à lire un cours de C.

Bonne chance
0