web-dev-qa-db-ja.com

行列式アルゴリズムC ++

私はプログラミングに不慣れで、行列の行列式を見つける方法を探していました。このコードをオンラインで見つけましたが、ここで使用されているアルゴリズムを理解するのに苦労しています。再帰のベースには問題はありませんが、continueとmainループが理解できません。アルゴリズムを説明してくれた人に感謝します。

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

このアルゴリズムは、問題を解決するために分割統治アプローチを使用します(N * N行列の行列式を見つける)。

アルゴリズムは、分割統治法の1つである再帰パターンを使用します。これは、アルゴリズムが3番目の条件ステートメントで自分自身を呼び出していることに気付くとわかります。

すべての再帰的アルゴリズムには、コードの最初のifステートメントである終了条件があります。また、そもそも解決が難しい主要な大きな問題の最も便利な問題やアトミックな問題の解決策であるセクションも含まれています。コードの2番目のifステートメントを見るとわかるように、アトミック問題または最も分割された問題は簡単に解決できます。あなたの場合、それは実際には2 * 2行列の行列式を解いています。

コードでどちらが少し難しいかを理解するための最も重要な部分は、分割を行う部分です(これも再帰的です!)。この部分はどちらかを征服するための鍵を持っています。少しバックトレースと数値例を実行することで、それを見つけることができます。

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

最後の提案として、1回の除算のみが必要な3 * 3行列を試してください。それで頑張ってください。

この本はアルゴリズムの研究と理解を始めるのに最適な本です

7
Novin Shahroudi