2013-11-07 4 views
0

Так что это мой код, он вычисляет детерминант матрицы рекурсивно с использованием расширения Лапласа. Когда я печатаю ответ, он печатает в правильном формате, но цифры неверны. Я понятия не имею, почему и, надеюсь, вы, ребята, узнаете больше меня.Странный результат вычисления кода детерминанта матрицы

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

/* Define a determinant for a certain matrix and dimension size*/ 
double det(double **mattemp, int size); 

/*Find the values for our matrix and it's dimension*/ 
int main(int argc, char* argv[]) 
{ 
FILE   *input; 
int   i, j, pos; 
int   dim=1; 
double  **matrix; 

/*Open File*/ 
input = fopen("matrix.dat", "r"); 

/*Check file isn't NULL, if good find the no of lines and hence dimensions*/ 
if((input != (FILE*) NULL)) 
{ 
    while (EOF != (pos = fgetc(input))) 
    { 
     if (pos == '\n') 
     { 
      ++dim; 
     } 
    } 
} 
else 
{ 
    printf("********************\n"); 
    printf("Could not open file!\n"); 
    printf("********************\n"); 
    return(EXIT_FAILURE); 
} 

/*Close and reopen file and set the matrix*/ 
fclose(input); 
input = fopen("matrix.dat", "r"); 
matrix=(double**)malloc(dim*sizeof(double)); 

/*Fill the matrix with values from the file*/ 
for(i=0; i<dim; i++) 
{ 
    matrix[i]=(double*)malloc(dim*sizeof(double)); 
} 
for(i=0; i<dim; i++) 
{ 
    for(j=0; j<dim; j++) 
    { 
     fscanf(input, "%lf", &matrix[i][j]); 
    } 
} 

/*Close the file*/ 
fclose(input); 

/*Print the matrix*/ 
for(i=0; i<dim; i++) 
{ 
    printf("| "); 
    for(j=0; j<dim; j++) 
    { 
     printf("%lf ", matrix[i][j]); 
    } 

    if(i != dim/2) 
    { 
     printf("|\n"); 
    } 
    else 
    { 
     printf("| = %lf \n", det(matrix, dim)); 
    } 
} 
return(EXIT_SUCCESS); 
} 


double det(double **mattemp, int size) 
{ 
double dettemp, **temp;  
int  j, itemp, jtemp, jcurr; 
double column[size]; 

dettemp = 0; 

if(size==1) 
{ 
    dettemp = mattemp[0][0]; 
} 
else if(size==2) 
{ 
    dettemp = ((mattemp[0][0]*mattemp[1][1])-(mattemp[0][1]*mattemp[1][0])); 
} 
else 
{ 
    for (j=0; j<size; j++) 
    { 

     temp = malloc((size-1)*sizeof(*temp)); 

     for(itemp=0; itemp<(size-1); itemp++) 
     { 

      temp[itemp]=malloc((size-1)*sizeof(double*)); 
     } 

     for(itemp=1; itemp<size; itemp++) 
     { 

      jtemp=0; 

      for(jcurr=0; jcurr<size; jcurr++) 
      { 


       if(jcurr==j) 
       { 
        continue; 
       } 

       temp[itemp-1][jtemp] = mattemp[itemp][jcurr]; 
       jtemp++; 
      } 

     } 

     dettemp += (mattemp[0][j]*pow(-1,j)*det(temp, size-1)); 
    } 

    return(dettemp); 
} 
} 
+0

Вероятно, это не проблема, но вы не должны использовать '% lf' - просто используйте'% f'. – paddy

+0

Спасибо, yer просто изменил его, и это одно и то же:/ – Carterini

+0

На самом деле получается, что создание всех из них% lf работает, однако теперь значение расчетного определителя неверно – Carterini

ответ

1

return(dettemp) в det() неуместна.

Функция должна закончиться

} 
    return (dettemp); 
} 
+0

О, ничего себе! Не могу поверить, что это было так просто, это убивало меня целую вечность. Огромное спасибо!!! – Carterini

+0

Двойная проверка выдает результат компиляции и уровень предупреждения, который вы используете. Эта проблема должна была отмечать все диагностическое сообщение. – chux