简体   繁体   English

矩阵行列式算法 C++

[英]Matrix determinant algorithm C++

I'm new to programming and I was looking for a way to find the determinant of a matrix.我是编程新手,我一直在寻找一种方法来找到矩阵的行列式。 I found this code online, but I have trouble understanding the algorithm in place here.我在网上找到了这段代码,但我很难理解这里的算法。 I have no problems for the base of the recursion , but the continue and main loop I have trouble understanding.我对递归的基础没有问题,但是我无法理解 continue 和主循环。 Big thanks to anyone who can explain to me the algorithm.非常感谢任何可以向我解释算法的人。

int determ(int a[MAX][MAX],int n) {
  int det=0, p, h, k, i, j, temp[MAX][MAX];
  if(n==1) {
    return a[0][0];
  } else if(n==2) {
    det=(a[0][0]*a[1][1]-a[0][1]*a[1][0]);
    return det;
  } else {
    for(p=0;p<n;p++) {
      h = 0;
      k = 0;
      for(i=1;i<n;i++) {
        for( j=0;j<n;j++) {
          if(j==p) {
            continue;
          }
          temp[h][k] = a[i][j];
          k++;
          if(k==n-1) {
            h++;
            k = 0;
          }
        }
      }
      det=det+a[0][p]*pow(-1,p)*determ(temp,n-1);
    }
    return det;
  }
}

This algorithm uses a divide-conquer approach for solving the problem (finding the determinant of an N*N Matrix).该算法使用分治法来解决问题(找到 N*N 矩阵的行列式)。

The algorithm uses a recursive pattern which is one of divide and conquer approaches.该算法使用递归模式,这是一种分而治之的方法。 You can find out this by noticing the algorithm is calling itself in the third condition statement.您可以通过注意到算法在第三个条件语句中调用自身来发现这一点。

Every recursive algorithm have an exit condition which is the first if-statement in your code.每个递归算法都有一个退出条件,它是代码中的第一个 if 语句。 and they also contain a section which is the solution to the most convenient problem or an atomic problem of the main big problem which is hard to solve in the first place.并且它们还包含一个部分,该部分是最方便的问题的解决方案,或者是首先难以解决的主要大问题的原子问题。 The atomic problem or the most-divided problem can be solved easily as you can see the the second if-statement of your code.原子问题或最分裂的问题可以很容易地解决,因为您可以看到代码的第二个 if 语句。 In your case it is actually solving the determinant of a 2*2 Matrix.在您的情况下,它实际上是在解决 2*2 矩阵的行列式。

The most important part of your code to understand which is challenging a little bit too is the part you do the dividing (which is recursive too!).代码中最重要的部分是理解哪个也有点挑战性,就是你做除法的部分(这也是递归的!)。 This part has the key to conquering either.这部分是征服两者的关键。 By doing a little back trace and numerical examples you can find it out:通过做一点回溯和数值例子,你可以找到它:

det = det + a[0][p] * pow(-1,p) * determ(temp,n-1);

For the final suggestion try a 3*3 Matrix which only needs one dividing.对于最后的建议,尝试一个 3*3 矩阵,它只需要一个除法。 Good luck with that.祝你好运。

This book is a great one to start studying and understanding algorithms这本书是开始学习和理解算法的好书

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int **submatrix(int **matrix, unsigned int n, unsigned int x, unsigned int y) {
    int **submatrix = new int *[n - 1];
    int subi = 0;
    for (int i = 0; i < n; i++) {
        submatrix[subi] = new int[n - 1];
        int subj = 0;
        if (i == y) {
            continue;
        }
        for (int j = 0; j < n; j++) {
            if (j == x) {
                continue;
            }
            submatrix[subi][subj] = matrix[i][j];
            subj++;
        }
        subi++;
    }
    return submatrix;
}

int determinant(int **matrix, unsigned int n) {
    int det = 0;
    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1];
    }
    for (int x = 0; x < n; ++x) {
        det += ((x % 2 == 0 ? 1 : -1) * matrix[0][x] * determinant(submatrix(matrix, n, x, 0), n - 1));
    }

    return det;
}

int main() {
    int n;
    cin >> n;
    int **matrix = new int *[n];
    for (int i = 0; i < n; ++i) {
        matrix[i] = new int[n];
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    cout << determinant(matrix, n);

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM