2017-01-04 40 views
-1

行演算を使って正方行列の行列式を計算しようとしています。 私はこのコードに遭遇しましたが、実際の動作は分かりません。行列の行列式を計算する

subisubjは何をしますか?行操作を使用していますか?

このコードの背景にある論理は何ですか?

int c, subi, i, j, subj; 

double submat[10][10],d=0; 

if (n == 2) { 
    return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1])); 
} 
else { 
    for (c = 0; c < n; c++) { 
     subi = 0; 
     for (int i = 1; i < n; i++) { 
      subj = 0; 
      for (j = 0; j < n; j++) { 
       if (j == c) 
        continue; 
       submat[subi][subj] = mat[i][j]; 
       subj++; 
      } 
      subi++; 
     } 
     d = d + (pow(-1, c)*mat[0][c] * determinant(n - 1, submat)); 
    } 
} 
return d; 
+0

'double determinant(int n、double mat [10] [10]) 'のような関数シグネチャがありません。 –

+0

[行列の決定子](http://www.geeksforgeeks。 org /行列の行列式/)はかなり良いと説明されています。 submatは、行がsubiで列がsubjである一時的な行列です。 – Skywrath

答えて

0

これは、そのベースケース2×2行列である行列式を計算するLaplace expansionを用いて再帰関数です。入力が1の行列である場合

  • サブマットは10で10のサイズによって制限されているもの

    1. しかし、ために私には良いプログラムではないようです

    2. サブマットは行列が大きい場合、LU decompositionを使用することをお勧めしメモリ

    3. の無駄です。

      double determinant(int n, double mat[10][10]); 
      

      を再帰的に行を通過し、その行1列の行列のすべての値を返すための部分行列に自分自身を呼び出す:のように見える

  • 0

    機能。再帰は2行2列の行列で終わります。