Calculs de normes matricielles - C - Programmation
MarshPosté le 17-10-2007 à 15:47:38
Salut tout le monde,
Je débute en programmation et j'aurais besoin d'un petit coup de pouce. Je dois calculer les normes matricielles (norme 1 et norme infinie). J'ai essayé de le sprogrammer, à la compilation ça passe, par contre je ne comprends pas pourquoi ça plante à l'exécution. Je vous mets ici mon code pour la norme 1 (pour la norme infinie il suffit juste de permuter les indices) :
main.c :
Code :
#include <stdio.h>
#include "functions.h"
int main ()
{ int i,j,c,nrows,ncols;
double **mat;
double res1,res3;
printf("Choose the norm you want to calculate :\n 1. l1 norm\n 2. linf norm\n " );
scanf("%d",&c);
printf("Please input the number of rows and columns for the matrix. These numbers must be the same :\n" );
scanf("%d %d",&nrows,&ncols);
mat = dmatrix(nrows,ncols); /* dynamic allocation for the matrix*/
printf("Please input the %d*%d matrix elements :\n",nrows,ncols);
/*nested loop*/
for (i=0;i<nrows;i++)
{
for (j=0;j<ncols;j++)
{
scanf("%lf",&mat[i][j]);
}
}
switch (c)
{case 1: res1=norm1(mat,nrows,ncols);
printf("The result is %lf", res1);
break;
case 2: res3=norminf(mat,nrows,ncols);
printf("The result is %lf", res3);
break;
}
/* frees the memory for the matrix */
for (i=0;i<nrows;i++)
{
free(mat[i]);
}
free(mat);
}
functions.c (contient les fonctions qui vont calculer les normes)
Code :
#include <math.h>
double norminf(double **mat ,int nrows, int ncols)
{
double sum, res;
int i,j;
res=0;
sum=0;
for(i=0;i<=nrows;i++)
{
for(j=0;j<=ncols;j++)
{
sum = sum + fabs(mat[i][j]);
if(sum>res)
{
res=sum;
}
}
}
return(res);
}
double norm1(double **mat ,int nrows, int ncols)
{
double sum, res;
int i,j;
res=0;
sum=0;
for(j=0;j<=ncols;i++)
{
for(i=0;i<=nrows;i++)
{
sum = sum + fabs(mat[i][j]);
if(sum>res)
{
res=sum;
}
}
}
return(res);
}
memory.c (gestion de la mémoire dynamique)
Code :
#include <stdio.h>
/* dynamic memory allocation function for a matrix */
double ** dmatrix (int nrows, int ncols)
{
double **mat; /* matrix */
int i;
mat = (double **)malloc(nrows*sizeof(double*));
for(i=0;i<nrows;i++)
{
mat[i] = (double *)malloc(ncols*sizeof(double));
}
return mat;
}
J'ai fait aussi un function.h pour les prototypes des fonctions. Est-ce que des programmeurs un peu plus expérimentés pourraient m'aider ? Merci bcp
Il faut avoir inférieur strictement au lieu d'inférieur ou égal dans les boucles de fonctions.c, car la matrice a été allouée avec les bornes excluses.
Marsh Posté le 17-10-2007 à 15:47:38
Salut tout le monde,
Je débute en programmation et j'aurais besoin d'un petit coup de pouce. Je dois calculer les normes matricielles (norme 1 et norme infinie). J'ai essayé de le sprogrammer, à la compilation ça passe, par contre je ne comprends pas pourquoi ça plante à l'exécution. Je vous mets ici mon code pour la norme 1 (pour la norme infinie il suffit juste de permuter les indices) :
main.c :
functions.c (contient les fonctions qui vont calculer les normes)
memory.c (gestion de la mémoire dynamique)
J'ai fait aussi un function.h pour les prototypes des fonctions. Est-ce que des programmeurs un peu plus expérimentés pourraient m'aider ? Merci bcp