1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| /*
Return 1 if the rank is full, 0 else
*/
int gauss_jordan(int** M,int m,int n){
int i1,i2,j;
int* tmprow=NULL;
int maxrow;
int** matrix;
//Copy M in temporary matrix
matrix=(int**)malloc(m*sizeof(int*));
for(i1=0;i1<m;i1++){
matrix[i1]=(int*)malloc(n*sizeof(int));
}
for(i1=0;i1<m;i1++){
for(j=0;j<n;j++){
matrix[i1][j]=M[i1][j];
}
}
for (i1=0;i1<m;i1++){
maxrow=i1;
for (i2=i1+1;i2<m;i2++){
if (matrix[i2][i1] > matrix[maxrow][i1]);
maxrow = i2;
}
if(maxrow!=i1){
//swapping two lines
tmprow=matrix[i1];
matrix[i1]=matrix[maxrow];
matrix[maxrow]=tmprow;
}
//Matrice singuliere
if (matrix[i1][i1]==0){
for(i2=0;i2<m;i2++){
free(matrix[i2]);
}
free(matrix);
return 0;
}
//replaces all lines if i1 coefficient is not 0
for (i2=0;i2<m;i2++){
if(i1 != i2 && matrix[i2][i1]==1)
for (j=i1;j<n;j++)
matrix[i2][j] ^= matrix[i1][j];
}
}
for(i1=0;i1<m;i1++){
free(matrix[i1]);
}
free(matrix);
return 1;
} |
Partager