как вычислить определитель матрицы в C с помощью рекурсивных функций - PullRequest
0 голосов
/ 25 января 2020

Здравствуйте. Я пытался создать программу C, которая вычисляла бы определитель данной матрицы. Я немного закончил, но застрял, когда пытался создать функцию, которая находит подматрицу данной матрицы и компонента. Я прокомментировал как можно более четко в каждой части, но я считаю, что основная проблема с программой - последний метод subMatrix. Если бы вы могли помочь мне исправить это или представить альтернативное решение, я был бы очень признателен.
PS: Я знаю, что часть кода или комментарии могут быть неясными, поэтому не стесняйтесь задавать мне любые вопросы в комментариях.

#define MAX 10000
    //here I was trying to make a "matrix" type to be able to return values in the function "subMatrix"
    struct Matrix
    {
        double a[MAX][MAX];
    };


    struct Matrix subMatrix(int n, double m[n][n], int I, int J);
    double determinant(int n, double M[n][n]);


    int main()
    {
        int n, k = 0;
        printf("how many rows does the matrix have"); 
        scanf("%d", &n);
        double Matrix[n][n];
        double temp[n * n];
        printf("enter the numbers in order with an enter after each one");
        //gathering all the data from the user
        for (int i = 0; i < n * n; i++)
        {
            scanf("%d", temp[i]);
        }
        //sorting the data into a matrix
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                Matrix[i][j] = temp[k];
                k++;
            }
        }
        //prints the determinant
        printf("%d",determinant(n,Matrix));

        return 0;
    }
    //this recursive function calculates the determinant 
    double determinant(int n, double M[n][n])
    {
        double det = 0;
        //the functions continues to call its self until n=2
        if (n == 2)
        {
            det = M[0][0] *M[1][1]-M[0][1]*M[1][0];
        }
        else
        {
            for (int i = 0; i < n; i++)
            {
                det += M[0][i] * determinant(n - 1, subMatrix(n, M, 0, i));
            }
        }



        return det;
    }
    //here I tried to make the subMatrix of a given matrix and one of its components
    //by sub matrix I mean the matrix that doesn't include the row and columns that are in line with one of the matrix componants
    struct Matrix subMatrix(int n, double m[n][n], int I, int J)
    {
        int i, a = 0, b = 0;
        int j;
        struct Matrix M[n - 1][n - 1];
        for (i = 0; i < n; i++)
        {
            if (i != I)
            {
                for (j = 0; j < n; j++)
                {
                    if (J != j)
                    {
                        M[a][b] = m[i][j];
                        b++;
                    }
                }
                a++;
            }
        }
        return M;
    }

Ответы [ 2 ]

1 голос
/ 26 января 2020

Есть несколько проблем с вашим кодом,

  1. subMatrix возвращает указатель struct Matrix, но ожидается, что это будет просто значение struct Matrix
  2. In subMatrix b увеличивается и не сбрасывается в новой строке.
  3. Аргумент для determinant ожидает double M[n][n], но передает struct Matrix при рекурсивном вызове
  4. избыточное использование локальной переменной temp[n * n]
  5. неправильное поведение на входе n=1

Простое решение для возврата 2D-массива из subMatrix - передать ссылку на 2D-массив и заполнить требуемое значение внутри функции.

Я попытался просто создать беспорядок следующим образом:

void subMatrix(int n, double m[n][n], int I, int J,double M[n-1][n-1])
{
    int i, a = 0, b = 0;
    int j;
    for (i = 0; i < n; i++)
    {
        if (i == I)
        {
            continue;
        }

        b = 0;//in-order to start fresh for new row
        for (j = 0; j < n; j++)
        {
            if (J == j)
            {
                continue;
            }
            M[a][b] = m[i][j];
            b++;
        }
        a++;
    }
}

//this recursive function calculates the determinant 
double  determinant(int n, double M[n][n])
{
    double det = 0;
    //the functions continues to call its self until n=2
    if(n==1)
    {
        return M[0][0];
    }
    if (n == 2)
    {
        det = M[0][0] *M[1][1]-M[0][1]*M[1][0];
    }
    else
    {
        double subArray[n-1][n-1];
        for (int i = 0; i < n; i++)
        {
            //subMatrix is filling the subArray
            subMatrix(n,M,0,i,subArray);
            det += M[0][i] * ((i&1)?-1:1)*determinant(n - 1,subArray);
        }
    }
    return det;
}

int main()
{
    int n, k = 0;

    printf("how many rows does the matrix have"); 
    scanf("%d", &n);

    double Matrix[n][n];
    printf("enter the numbers in order with an enter after each one");

   //Taking user input for 2D array
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%lf", &Matrix[i][j]);
        }
    }

    printf("%f",determinant(n,Matrix));
    return 0;
}
0 голосов
/ 27 января 2020

Вот мое собственное решение, я не опубликовал его раньше, потому что я не смог найти ошибку, но благодаря @Truthseeker я понял, что не позволю b = 0, и я заставил его работать, эта программа может рассчитать определитель, но ответ искателей истины математически ошибочен, потому что он забыл pow (-1, i) в методе определителя

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


    void subMatrix(int n,double M[n-1][n-1], double m[n][n], int I, int J)
    {
        int i, a = 0, b = 0;
        int j;
        for (i = 0; i < n; i++)
        {
            if (i != I)
            {
                for (j = 0; j < n; j++)
                {
                    if (J != j)
                    {
                        M[a][b] = m[i][j];

                        b++;

                    }
                }

                a++;
                b=0;
            }
        }

    }

    //this recursive function calculates the determinant
    double determinant (int n, double m[n][n])
    {

      double det = 0;
      //the functions continues to call its self until n=2
      if (n == 1)
        {
          return m[0][0];
        }
      if (n == 2)
        {
          det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
        }
      else
        {
          double M[n - 1][n - 1];
          for (int i = 0; i < n; i++)
        {
          subMatrix (n, M, m, 0, i);
          det += m[0][i] * pow (-1, i) * determinant (n - 1, M);
        }
        }

      return det;
    }

    int
    main ()
    {
      int n, k = 0;


      printf ("how many rows does the matrix have");
      scanf ("%d", &n);
      double Matrix[n][n];
      printf ("enter the numbers in order with an enter after each one");
      //Taking user input for 2D array
      for (int i = 0; i < n; i++)
        {
          for (int j = 0; j < n; j++)
        {
          scanf ("%lf", &Matrix[i][j]);
        }
        }

      //prints the determinant
      printf ("the determinant is %lf\n", determinant (n, Matrix));

      return 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...