矩阵行列式算法C++

use*_*334 6 c++ algorithm matrix determinants

我是编程的新手,我正在寻找一种方法来找到矩阵的行列式.我在网上找到了这个代码,但是我无法理解这里的算法.我对递归的基础没有问题,但是继续和主循环我很难理解.非常感谢任何能向我解释算法的人.

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Nov*_*udi 7

该算法使用分而治之的方法来解决问题(找到N*N矩阵的行列式).

该算法使用递归模式,这是一种分而治之的方法.您可以通过注意算法在第三个条件语句中调用自身来找到它.

每个递归算法都有一个退出条件,这是代码中的第一个if语句.它们还包含一个部分,它解决了最方便的问题,或者首先难以解决的主要问题的原子问题.可以轻松解决原子问题或分歧最大的问题,因为您可以看到代码的第二个if语句.在你的情况下,它实际上是解决2*2矩阵的行列式.

你的代码中最重要的一部分就是你要分解的部分(这也是递归的!).这部分是征服其中任何一个的关键.通过做一些回溯跟踪和数值示例,您可以找到它:

det = det + a[0][p] * pow(-1,p) * determ(temp,n-1);
Run Code Online (Sandbox Code Playgroud)

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

这本书是开始学习和理解算法的好书