给定一个正方形矩阵,找到矩阵的伴随和逆。
我们强烈建议您在下面参考此要求。
矩阵的行列式
什么是伴随?
矩阵的伴随(或Adjugate)是通过对给定方阵的辅因子矩阵进行转置而获得的矩阵,称为其伴随(Adjoint)或Adjugate矩阵。任何方阵“ A”(例如)的伴随项都表示为Adj(A)。
例子:
Below example and explanation are taken from here.
5 -2 2 7
1 0 0 3
-3 1 5 0
3 -1 -9 4
For instance, the cofactor of the top left corner '5' is
+ |0 0 3|
...|1 5 0| = 3(1 * -9 - (-1) * 5) = -12.
...|-1 -9 4|
(The minor matrix is formed by deleting the row
and column of the given entry.)
As another sample, the cofactor of the top row corner '-2' is
-|1 0 3|
...|-3 5 0| = - [1 (20 - 0) - 0 + 3 (27 - 15)] = -56.
...|3 -9 4|
Proceeding like this, we obtain the matrix
[-12 -56 4 4]
[76 208 4 4]
[-60 -82 -2 20]
[-36 -58 -10 12]
Finally, to get the adjoint, just take the previous
matrix's transpose:
[-12 76 -60 -36]
[-56 208 -82 -58]
[4 4 -2 -10]
[4 4 20 12]
重要特性:
- 方阵A及其伴随的乘积会产生一个对角矩阵,其中每个对角项都等于A的行列式。
IE,A.adj(A) = det(A).I I => Identity matrix of same order as of A. det(A) => Determinant value of A
- 如果存在阶次为n的唯一平方矩阵“ B”,则阶为n的非零平方矩阵“ A”被认为是可逆的,
A.B = B.A = I The matrix 'B' is said to be inverse of 'A'. i.e., B = A-1
如何找到伴随物?
我们遵循上面给出的定义。
Let A[N][N] be input matrix.
1) Create a matrix adj[N][N] store the adjoint matrix.
2) For every entry A[i][j] in input matrix where 0 <= i < N
and 0 <= j < N.
a) Find cofactor of A[i][j]
b) Find sign of entry. Sign is + if (i+j) is even else
sign is odd.
c) Place the cofactor at adj[j][i]
如何找到逆?
仅当矩阵非奇异(即行列式不应为0)时,才存在矩阵的逆。
使用行列式和伴随式,我们可以使用以下公式轻松找到方阵的逆,
If det(A) != 0
A-1 = adj(A)/det(A)
Else
"Inverse doesn't exist"
逆用于查找线性方程组的解。
下面是查找矩阵的伴随和逆的实现。
C++
// C++ program to find adjoint and inverse of a matrix
#include
using namespace std;
#define N 4
// Function to get cofactor of A[p][q] in temp[][]. n is current
// dimension of A[][]
void getCofactor(int A[N][N], int temp[N][N], int p, int q, int n)
{
int i = 0, j = 0;
// Looping for each element of the matrix
for (int row = 0; row < n; row++)
{
for (int col = 0; col < n; col++)
{
// Copying into temporary matrix only those element
// which are not in given row and column
if (row != p && col != q)
{
temp[i][j++] = A[row][col];
// Row is filled, so increase row index and
// reset col index
if (j == n - 1)
{
j = 0;
i++;
}
}
}
}
}
/* Recursive function for finding determinant of matrix.
n is current dimension of A[][]. */
int determinant(int A[N][N], int n)
{
int D = 0; // Initialize result
// Base case : if matrix contains single element
if (n == 1)
return A[0][0];
int temp[N][N]; // To store cofactors
int sign = 1; // To store sign multiplier
// Iterate for each element of first row
for (int f = 0; f < n; f++)
{
// Getting Cofactor of A[0][f]
getCofactor(A, temp, 0, f, n);
D += sign * A[0][f] * determinant(temp, n - 1);
// terms are to be added with alternate sign
sign = -sign;
}
return D;
}
// Function to get adjoint of A[N][N] in adj[N][N].
void adjoint(int A[N][N],int adj[N][N])
{
if (N == 1)
{
adj[0][0] = 1;
return;
}
// temp is used to store cofactors of A[][]
int sign = 1, temp[N][N];
for (int i=0; i
void display(T A[N][N])
{
for (int i=0; i
Java
// Java program to find adjoint and inverse of a matrix
class GFG
{
static final int N = 4;
// Function to get cofactor of A[p][q] in temp[][]. n is current
// dimension of A[][]
static void getCofactor(int A[][], int temp[][], int p, int q, int n)
{
int i = 0, j = 0;
// Looping for each element of the matrix
for (int row = 0; row < n; row++)
{
for (int col = 0; col < n; col++)
{
// Copying into temporary matrix only those element
// which are not in given row and column
if (row != p && col != q)
{
temp[i][j++] = A[row][col];
// Row is filled, so increase row index and
// reset col index
if (j == n - 1)
{
j = 0;
i++;
}
}
}
}
}
/* Recursive function for finding determinant of matrix.
n is current dimension of A[][]. */
static int determinant(int A[][], int n)
{
int D = 0; // Initialize result
// Base case : if matrix contains single element
if (n == 1)
return A[0][0];
int [][]temp = new int[N][N]; // To store cofactors
int sign = 1; // To store sign multiplier
// Iterate for each element of first row
for (int f = 0; f < n; f++)
{
// Getting Cofactor of A[0][f]
getCofactor(A, temp, 0, f, n);
D += sign * A[0][f] * determinant(temp, n - 1);
// terms are to be added with alternate sign
sign = -sign;
}
return D;
}
// Function to get adjoint of A[N][N] in adj[N][N].
static void adjoint(int A[][],int [][]adj)
{
if (N == 1)
{
adj[0][0] = 1;
return;
}
// temp is used to store cofactors of A[][]
int sign = 1;
int [][]temp = new int[N][N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
// Get cofactor of A[i][j]
getCofactor(A, temp, i, j, N);
// sign of adj[j][i] positive if sum of row
// and column indexes is even.
sign = ((i + j) % 2 == 0)? 1: -1;
// Interchanging rows and columns to get the
// transpose of the cofactor matrix
adj[j][i] = (sign)*(determinant(temp, N-1));
}
}
}
// Function to calculate and store inverse, returns false if
// matrix is singular
static boolean inverse(int A[][], float [][]inverse)
{
// Find determinant of A[][]
int det = determinant(A, N);
if (det == 0)
{
System.out.print("Singular matrix, can't find its inverse");
return false;
}
// Find adjoint
int [][]adj = new int[N][N];
adjoint(A, adj);
// Find Inverse using formula "inverse(A) = adj(A)/det(A)"
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
inverse[i][j] = adj[i][j]/(float)det;
return true;
}
// Generic function to display the matrix. We use it to display
// both adjoin and inverse. adjoin is integer matrix and inverse
// is a float.
static void display(int A[][])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
System.out.print(A[i][j]+ " ");
System.out.println();
}
}
static void display(float A[][])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
System.out.printf("%.6f ",A[i][j]);
System.out.println();
}
}
// Driver program
public static void main(String[] args)
{
int A[][] = { {5, -2, 2, 7},
{1, 0, 0, 3},
{-3, 1, 5, 0},
{3, -1, -9, 4}};
int [][]adj = new int[N][N]; // To store adjoint of A[][]
float [][]inv = new float[N][N]; // To store inverse of A[][]
System.out.print("Input matrix is :\n");
display(A);
System.out.print("\nThe Adjoint is :\n");
adjoint(A, adj);
display(adj);
System.out.print("\nThe Inverse is :\n");
if (inverse(A, inv))
display(inv);
}
}
// This code is contributed by Rajput-Ji
C#
// C# program to find adjoint and inverse of a matrix
using System;
using System.Collections.Generic;
class GFG
{
static readonly int N = 4;
// Function to get cofactor of A[p,q] in [,]temp. n is current
// dimension of [,]A
static void getCofactor(int [,]A, int [,]temp, int p, int q, int n)
{
int i = 0, j = 0;
// Looping for each element of the matrix
for (int row = 0; row < n; row++)
{
for (int col = 0; col < n; col++)
{
// Copying into temporary matrix only those element
// which are not in given row and column
if (row != p && col != q)
{
temp[i, j++] = A[row, col];
// Row is filled, so increase row index and
// reset col index
if (j == n - 1)
{
j = 0;
i++;
}
}
}
}
}
/* Recursive function for finding determinant of matrix.
n is current dimension of [,]A. */
static int determinant(int [,]A, int n)
{
int D = 0; // Initialize result
// Base case : if matrix contains single element
if (n == 1)
return A[0, 0];
int [,]temp = new int[N, N]; // To store cofactors
int sign = 1; // To store sign multiplier
// Iterate for each element of first row
for (int f = 0; f < n; f++)
{
// Getting Cofactor of A[0,f]
getCofactor(A, temp, 0, f, n);
D += sign * A[0, f] * determinant(temp, n - 1);
// terms are to be added with alternate sign
sign = -sign;
}
return D;
}
// Function to get adjoint of A[N,N] in adj[N,N].
static void adjoint(int [,]A, int [,]adj)
{
if (N == 1)
{
adj[0, 0] = 1;
return;
}
// temp is used to store cofactors of [,]A
int sign = 1;
int [,]temp = new int[N, N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
// Get cofactor of A[i,j]
getCofactor(A, temp, i, j, N);
// sign of adj[j,i] positive if sum of row
// and column indexes is even.
sign = ((i + j) % 2 == 0)? 1: -1;
// Interchanging rows and columns to get the
// transpose of the cofactor matrix
adj[j, i] = (sign) * (determinant(temp, N - 1));
}
}
}
// Function to calculate and store inverse, returns false if
// matrix is singular
static bool inverse(int [,]A, float [,]inverse)
{
// Find determinant of [,]A
int det = determinant(A, N);
if (det == 0)
{
Console.Write("Singular matrix, can't find its inverse");
return false;
}
// Find adjoint
int [,]adj = new int[N, N];
adjoint(A, adj);
// Find Inverse using formula "inverse(A) = adj(A)/det(A)"
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
inverse[i, j] = adj[i, j]/(float)det;
return true;
}
// Generic function to display the matrix. We use it to display
// both adjoin and inverse. adjoin is integer matrix and inverse
// is a float.
static void display(int [,]A)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
Console.Write(A[i, j]+ " ");
Console.WriteLine();
}
}
static void display(float [,]A)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
Console.Write("{0:F6} ", A[i, j]);
Console.WriteLine();
}
}
// Driver program
public static void Main(String[] args)
{
int [,]A = { {5, -2, 2, 7},
{1, 0, 0, 3},
{-3, 1, 5, 0},
{3, -1, -9, 4}};
int [,]adj = new int[N, N]; // To store adjoint of [,]A
float [,]inv = new float[N, N]; // To store inverse of [,]A
Console.Write("Input matrix is :\n");
display(A);
Console.Write("\nThe Adjoint is :\n");
adjoint(A, adj);
display(adj);
Console.Write("\nThe Inverse is :\n");
if (inverse(A, inv))
display(inv);
}
}
// This code is contributed by 29AjayKumar
输出:
The Adjoint is :
-12 76 -60 -36
-56 208 -82 -58
4 4 -2 -10
4 4 20 12
The Inverse is :
-0.136364 0.863636 -0.681818 -0.409091
-0.636364 2.36364 -0.931818 -0.659091
0.0454545 0.0454545 -0.0227273 -0.113636
0.0454545 0.0454545 0.227273 0.136364
有关getCofactor()和determinant()的详细信息,请参阅https://www.geeksforgeeks.org/determinant-of-a-matrix/。
参考:
https://www.geeksforgeeks.org/determinant-of-a-matrix/
https://zh.wikipedia.org/wiki/Adjugate_matrix