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

グラフ行列の逆行列を見つけるためのC++プログラム


これは、グラフ行列の逆行列を見つけるためのC++プログラムです。行列の逆行列は、行列が非特異である場合にのみ存在します。つまり、行列式は0であってはなりません。行列の逆行列は多くの方法で見つけることができます。ここでは、随伴行列とその行列式を使用して、グラフ行列の逆行列を見つけます。例に含まれる手順

Begin
   function INV() to get the inverse of the matrix:
   Call function DET().
   Call function ADJ().
   Find the inverse of the matrix using the formula;
   Inverse(matrix) = ADJ(matrix) / DET(matrix)
End.

#include<bits/stdc++.h>
using namespace std;
#define N 5
void getCfactor(int M[N][N], int t[N][N], int p, int q, int n) {
   int i = 0, j = 0;
   for (int r= 0; r< n; r++) {
      for (int c = 0; c< n; c++) //Copy only those elements which are not in given row r and column c: {
         if (r != p && c != q) { t[i][j++] = M[r][c]; //If row is filled increase r index and reset c index
            if (j == n - 1) {
               j = 0; i++;
            }
         }
      }
   }
}
int DET(int M[N][N], int n) //to find determinant {
   int D = 0;
   if (n == 1)
      return M[0][0];
   int t[N][N]; //store cofactors
   int s = 1; //store sign multiplier //
   To Iterate each element of first row
   for (int f = 0; f < n; f++) {
      //For Getting Cofactor of M[0][f] do getCfactor(M, t, 0, f, n); D += s * M[0][f] * DET(t, n - 1);
      s = -s;
   }
   return D;
}
void ADJ(int M[N][N],int adj[N][N])
//to find adjoint matrix {
   if (N == 1) {
      adj[0][0] = 1; return;
   }
   int s = 1,
   t[N][N];
   for (int i=0; i<N; i++) {
      for (int j=0; j<N; j++) {
         //To get cofactor of M[i][j]
         getCfactor(M, t, i, j, N);
         s = ((i+j)%2==0)? 1: -1; //sign of adj[j][i] positive if sum of row and column indexes is even.
         adj[j][i] = (s)*(DET(t, N-1)); //Interchange rows and columns to get the transpose of the cofactor matrix
      }
   }
}
bool INV(int M[N][N], float inv[N][N]) {
   int det = DET(M, N);
   if (det == 0) {
      cout << "can't find its inverse";
      return false;
   }
   int adj[N][N]; ADJ(M, adj);
   for (int i=0; i<N; i++) for (int j=0; j<N; j++) inv[i][j] = adj[i][j]/float(det);
   return true;
}
template<class T> void print(T A[N][N]) //print the matrix. {
   for (int i=0; i<N; i++) { for (int j=0; j<N; j++) cout << A[i][j] << " "; cout << endl; }
}
int main() {
   int M[N][N] = {
      {1, 2, 3, 4,-2}, {-5, 6, 7, 8, 4}, {9, 10, -11, 12, 1}, {13, -14, -15, 0, 9}, {20 , -26 , 16 , -17 , 25}
   };
   float inv[N][N];
   cout << "Input matrix is :\n"; print(M);
   cout << "\nThe Inverse is :\n"; if (INV(M, inv)) print(inv);
   return 0;
}

出力

Input matrix is :
1 2 3 4 -2
-5 6 7 8 4 
9 10 -11 12 1 
13 -14 -15 0 9 
20 -26 16 -17 25
The Inverse is : 
0.0811847 -0.0643008 0.0493814 -0.0247026 0.0237006 
-0.126819 -0.0161738 0.0745377 -0.0713976 0.0151639 
0.0933664 0.0028245 -0.0111876 -0.0220437 0.0154006 
0.143624 0.0582573 -0.0282371 0.0579023 -0.0175466 
-0.15893 0.0724272 0.0259728 -0.00100988 0.0150219

  1. グラフ内のスーパー頂点を見つけるためのC++プログラム

    n個の頂点を持つグラフが与えられたとします。頂点には1からnの番号が付けられ、配列edgesで指定されたエッジによって接続されます。各頂点には、配列valuesで指定された1からnまでの数値内のx値があります。ここで、グラフからスーパー頂点を見つける必要があります。頂点1からiへの最短経路にi番目の頂点と同じ「x」値を持つ頂点がない場合、頂点iは「スーパー頂点」と呼ばれます。この基準を満たすすべての頂点を印刷します。 したがって、入力がn =5のようである場合、値={1、2、2、1、3}、エッジ={{1、2}、{2、3}、{2、3}、{2、4 }、{4、5}}の場合、出力は1 345に

  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,