C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++の行列式?


行列式は、正方行列の場合にのみ、最初の行の補因子に対応する補因子の行列式を掛け、それらに代替の符号を追加して最終結果を得ることができます。

$$ A =\ begin {bmatrix} a&b&c \\ d&e&f \\ g&h&i \\ \ end {bmatrix} | A | =a(ei-fh)-b(di-gf)+ c(dh-eg)$$

最初に、行列と行列の次元値を取得するdeterminantOfMatrix(int mat [N] [N]、intdimension)関数があります。行列が1次元しかない場合は、[0][0]行列値を返します。この条件は、各再帰呼び出しの次元を減らして行列を再帰的に反復するため、基本条件としても使用されます。

int determinantOfMatrix(int mat[N][N], int dimension){
   int Det = 0;
   if (dimension == 1)
      return mat[0][0];

次に、cofactorMat [N] [N]を宣言します。これは、firstRowまでcofactor(int mat [N] [N]、int temp [N] [N]、int p、int q、int n)関数に渡されます。寸法よりも小さいです。行列式はDet変数に格納され、forループの反復ごとに符号が交互になります。その後、このdetはmain関数に戻され、そこで印刷されます。

int cofactorMat[N][N];
int sign = 1;
for (int firstRow = 0; firstRow < dimension; firstRow++){
   cofactor(mat, cofactorMat, 0, firstRow, dimension);
   Det += sign * mat[0][firstRow] * determinantOfMatrix(cofactorMat, dimension - 1);
   sign = -sign;
}
   return Det;
}

cofactor(int mat [N] [N]、int temp [N] [N]、int p、int q、int n)関数は、行列、余因子行列、0、firstRow値、および行列の次元を次のように取ります。パラメータ値。ネストされたforループは、マトリックスを反復処理するのに役立ちます。pとqの値がそれぞれ行と列の値と等しくない場合、これらの値は一時マトリックスに格納されます。

void cofactor(int mat[N][N], int temp[N][N], int p,int q, int n){
   int i = 0, j = 0;
for (int row = 0; row < n; row++){
   for (int column = 0; column < n; column++){
      if (row != p && column != q){
         temp[i][j++] = mat[row][column];

行がいっぱいになったら、行インデックスを増やし、列インデックスをリセットします。

if (j == n - 1){
   j = 0;
   i++;
}

最後に、display(int mat [N] [N]、int row、int col)があります。これは、行と列の数と行列を取り、2d配列として行列を反復処理し、各行と列にそれらの値を出力します。

void display(int mat[N][N], int row, int col){
   for (int i = 0; i < row; i++){
      for (int j = 0; j < col; j++)
         cout<<mat[i][j]<<" ";
         cout<<endl;
   }
   cout<<endl;
}

次の実装を見て、行列式を見つけましょう。

#include <iostream>
using namespace std;
const int N = 3;
void cofactor(int mat[N][N], int temp[N][N], int p,int q, int n){
   int i = 0, j = 0;
   for (int row = 0; row < n; row++){
      for (int column = 0; column < n; column++){
         if (row != p && column != q){
            temp[i][j++] = mat[row][column];
            if (j == n - 1){
                  j = 0;
                  i++;
            }
         }
      }
   }
}
int determinantOfMatrix(int mat[N][N], int dimension){
   int Det = 0;
   if (dimension == 1)
      return mat[0][0];
   int cofactorMat[N][N];
   int sign = 1;
   for (int firstRow = 0; firstRow < dimension; firstRow++){
      cofactor(mat, cofactorMat, 0, firstRow, dimension);
      Det += sign * mat[0][firstRow] * determinantOfMatrix(cofactorMat, dimension - 1);
      sign = -sign;
   }
   return Det;
}
void display(int mat[N][N], int row, int col){
   for (int i = 0; i < row; i++){
      for (int j = 0; j < col; j++)
         cout<<mat[i][j]<<" ";
         cout<<endl;
   }
   cout<<endl;
}
int main(){
   int mat[3][3] = {
      { 1, 0, 2},
      { 3, 0, 0},
      { 2, 1, 4}};
   cout<<"The matrix is "<<endl;
   display(mat,3,3);
   cout<<"Determinant of the matrix is "<<determinantOfMatrix(mat, N);
   return 0;
}

出力

上記のコードは次の出力を生成します-

The matrix is
1 0 2
3 0 0
2 1 4

Determinant of the matrix is 6

  1. C++のスパイラルマトリックスIII

    R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[

  2. C++でべき等行列をチェックするプログラム

    行列M[r][c]が与えられた場合、「r」は行数を示し、「c」はr=cが正方行列を形成するような列数を示します。与えられた正方行列がべき等行列であるかどうかを確認する必要があります かどうか。 べき等行列 行列「M」はべき等行列と呼ばれます 行列「M」にそれ自体を掛けたものだけが同じ行列「M」を返す場合、つまり M * M=M。 以下の例のように- 上記の行列はそれ自体で乗算され、同じ行列を返すと言えます。したがって、マトリックスはIデポテンツマトリックスです。 。 例 Input: m[3][3] = { {2, -2, -4},    {-1, 3,