1

我在让函数工作时遇到问题,该函数应该找到上三角矩阵的行列式。我的代码似乎返回了明显不正确的值,通常为零,我很确定这是由于我错误地定义了函数造成的。我怀疑这是我的一个基本错误,但在盯着它看了一段时间后,我还没有弄清楚。这是功能和打印代码:

int Determinant(int mat[20][20],int N)
{
int X=0,Det=0;
    if (N==2){
              Det=mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
              return(Det);
             }
    else {
             for(X = 0; X < N; X++){
             Det *= mat[X][X];

          }
         }
return (Det);
}

和打印功能:

determinant=Determinant(matrix,n);
printf("Determinant = %d",determinant);

我将包含我迄今为止编写的完整代码以提供更多详细信息。目前它的基本应用是定义和 n 由 n 矩阵 (2

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

int determinant(int mat[20][20],int N);
int Determinant(int mat[20][20],int N)
{
int X=0,Det=0;
    if (N==2){
              Det=mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
              return(Det);
             }
    else {
             for(X = 0; X < N; X++){
             Det *= mat[X][X];
          }
         }
return (Det);
}

int main()
{
    int n=0,i=1;
    printf("Please enter a number (n) between 2 and 4 to determine the dimensions of an (nxn) matrix \n");
    scanf("%d",&n);

        while(n<2||n>4){
            printf("The value %d does not lie within the required range of 2-4, please re-enter \n",n);
            scanf("%d",&n);
            i++;
            if (i>=3){
                      printf("\nYou have entered invalid values 3 times. The programme has been terminated");
                      exit(0);
                     }
           }

    printf("\n(%dx%d) matrix selected\n",n,n);
    int matrix[n][n];


                int f,g=0;
                printf("Please enter matrix elements\n");
                    for(f=0;f<n;f++){

                        for(g=0;g<n;g++){
                            printf("Element[%d][%d] = ",f,g);
                            scanf("%d",&matrix[f][g]);
                        }
                    }

      int k,j;
      printf("\nThe matrix is\n");
      for(k=0;k<n;k++){
          printf("\n");
          for(j=0;j<n;j++){
              printf("%d\t",matrix[k][j]);
              }
           }



        int temp=0,c=0,determinant=0;
        float factor=0;
        k=0;
    /* Transform matrix into upper triangular */
    for(i = 0; i < n - 1; i++)
    {
        /* Elementary Row Operation I */
        if(matrix[i][i] == 0)
        {
            for(k = i; k < n; k++)
            {
                if(matrix[k][i] != 0)
                {
                    for(j = 0; j < n; j++)
                    {
                        temp = matrix[i][j];
                        matrix[i][j] = matrix[k][j];
                        matrix[k][j] = temp;
                    }
                k = n;
                }
            }
            c++;
        }
        /* Elementary Row Operation III */
        if(matrix[i][i] != 0)
        {
            for(k = i + 1; k < n; k++)
            {
                factor = -1.0 * matrix[k][i] /  matrix[i][i];
                for(j = i; j < n; j++)
                {
                    matrix[k][j] = matrix[k][j] + (factor * matrix[i][j]);
                }
            }
        }
    }



      printf("\nThe Upper triangular is\n");
      for(k=0;k<n;k++){
          printf("\n");
          for(j=0;j<n;j++){
              printf("%d\t",matrix[k][j]);
              }
           }

determinant=Determinant(matrix,n);
printf("Determinant = %d",determinant);


    /*
           */

    return 0;
}
4

1 回答 1

0

问题基本上是您将矩阵作为参数传递的方式。要明白我的意思,请将函数的定义更改为:

int Determinant(int mat[5][5],int N);

并指示函数体打印传递的完整 5x5 矩阵:

int Determinant(int mat[5][5],int N)
{
    printf("\n");
    int a,b;
    for(a = 0; a < 5; a++)
    {
        for(b = 0; b < 5; b++)
        {
            printf("%d\t", mat[a][b]);
        }
        printf("\n");
    }

    int X=0,Det=0;

    Det = 1; // Add this too!
    for(X = 0; X < N; X++) {
        Det *= mat[X][X];
    }
    return (Det);
}

现在输入 n=3 作为矩阵维度并传递已经上三角矩阵

1 2 3
0 4 5
0 0 6

观察 Determinant() 函数中传递的矩阵的打印输出,它将是这样的:

1       2       3       0       4                                                                                                                                                
5       0       0       6       0                                                                                                                                                
4196432 0       -163754450      0       -1253168992                                                                                                                              
32764   3       0       0       0                                                                                                                                                
3       0       0       0       3 

这意味着您的数组已被“重塑”,并且您的实际数据存储在内存中的连续位置,与原始数组不同。

TLDR:虽然我对 C 语言不是很精通,但我认为您应该将二维数组定义为动态数组(例如使用双指针)。

PS:不要忘记在函数体中将 Det 变量初始化为 1 而不是 0,否则乘积永远等于 0。

于 2017-02-12T20:26:05.157 回答