矩阵决定算法C

Matrix determinant algorithm C++

本文关键字:算法 决定      更新时间:2023-10-16

我是编程的新手,我正在寻找一种找到矩阵决定因素的方法。我在网上找到了这个代码,但是我很难理解这里的算法。我对递归的基础没有任何问题,但是我很难理解的持续和主要循环。非常感谢任何可以向我解释算法的人。

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;
  }
}

此算法使用分隔纠纷方法来解决问题(查找n*n矩阵的决定因素)。

该算法使用递归模式,这是划分和征服方法之一。您可以通过注意到算法在第三条条件语句中自称来找到这一点。

每种递归算法都有一个退出条件,这是您代码中的第一个IF声明。它们还包含一个部分,该部分是解决最方便的问题或主要大问题的原子问题,首先很难解决。可以轻松解决原子问题或最细分的问题,因为您可以看到代码的第二个if statement。在您的情况下,实际上是在解决2*2矩阵的决定因素。

您代码中最重要的部分也有些挑战,这是您进行的划分的部分(这也是递归!)。这部分有征服的钥匙。通过做一些背面跟踪和数值示例,您可以找到它:

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

对于最终建议,尝试一个只需要一个分隔的3*3矩阵。祝你好运。

这本书是开始研究和理解算法的一本书

#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;
}