Рубрики

Сопряженный и обратный матрицы

По заданной квадратной матрице найдите сопряженную и обратную матрицу.

Мы настоятельно рекомендуем вам сослаться ниже в качестве предварительного условия этого.
Определитель матрицы

Что такое Адъюнкт?
Сопряженная (или адъюгатная) матрица — это матрица, полученная путем транспонирования кофакторной матрицы данной квадратной матрицы, называемой ее сопряженной или адъюгатной матрицей. Адъюнкт любой квадратной матрицы (скажем) представлен как 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.
    т.е.
    A.adj(A) = det(A).I 
    
    I  => Identity matrix of same order as of A.
    det(A) => Determinant value of A 
  • Матрица с ненулевым квадратом 'A' порядка n называется обратимой, если существует уникальная квадратная матрица 'B' порядка n такая, что
       A.B = B.A = I
    The matrix 'B' is said to be inverse of 'A'.
    i.e.,  B = A-1

Как найти Adjoint?
Мы следуем определению, данному выше.


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 ++ программа для поиска сопряженной и обратной матрицы
#include<bits/stdc++.h>

using namespace std;

#define N 4

  
// Функция для получения кофактора A [p] [q] в temp [] []. n является текущим
// размерность A [] []

void getCofactor(int A[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 col = 0; col < n; col++)

        {

            // Копирование во временную матрицу только тех элементов

            // которые не находятся в данной строке и столбце

            if (row != p && col != q)

            {

                temp[i][j++] = A[row][col];

  

                // Строка заполнена, поэтому увеличиваем индекс строки и

                // сбросить индекс col

                if (j == n - 1)

                {

                    j = 0;

                    i++;

                }

            }

        }

    }

}

  
/ * Рекурсивная функция для нахождения определителя матрицы.

   n - текущее измерение A [] []. * /

int determinant(int A[N][N], int n)

{

    int D = 0; // Инициализировать результат

  

    // Базовый случай: если матрица содержит один элемент

    if (n == 1)

        return A[0][0];

  

    int temp[N][N]; // Для хранения кофакторов

  

    int sign = 1;  // Сохранить множитель знака

  

     // Итерация для каждого элемента первой строки

    for (int f = 0; f < n; f++)

    {

        // Получение кофактора A [0] [f]

        getCofactor(A, temp, 0, f, n);

        D += sign * A[0][f] * determinant(temp, n - 1);

  

        // условия должны быть добавлены с альтернативным знаком

        sign = -sign;

    }

  

    return D;

}

  
// Функция для присоединения A [N] [N] в adj [N] [N].

void adjoint(int A[N][N],int adj[N][N])

{

    if (N == 1)

    {

        adj[0][0] = 1;

        return;

    }

  

    // temp используется для хранения кофакторов A [] []

    int sign = 1, temp[N][N];

  

    for (int i=0; i<N; i++)

    {

        for (int j=0; j<N; j++)

        {

            // Получить кофактор A [i] [j]

            getCofactor(A, temp, i, j, N);

  

            // знак adj [j] [i] положительный, если сумма строки

            // и индексы столбцов четные.

            sign = ((i+j)%2==0)? 1: -1;

  

            // Меняем строки и столбцы, чтобы получить

            // транспонировать матрицу кофактора

            adj[j][i] = (sign)*(determinant(temp, N-1));

        }

    }

}

  
// Функция для вычисления и сохранения обратного, возвращает false, если
// матрица единственного числа

bool inverse(int A[N][N], float inverse[N][N])

{

    // Найти определитель A [] []

    int det = determinant(A, N);

    if (det == 0)

    {

        cout << "Singular matrix, can't find its inverse";

        return false;

    }

  

    // Найти сопряженное

    int adj[N][N];

    adjoint(A, adj);

  

    // Находим обратное, используя формулу "обратный (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;

}

  
// Универсальная функция для отображения матрицы. Мы используем его для отображения
// как смежные, так и обратные. примыкает целочисленная матрица и обратная
// это число с плавающей точкой

template<class T>

void display(T A[N][N])

{

    for (int i=0; i<N; i++)

    {

        for (int j=0; j<N; j++)

            cout << A[i][j] << " ";

        cout << endl;

    }

}

  
// Драйвер программы

int main()

{

    int A[N][N] = { {5, -2, 2, 7},

                    {1, 0, 0, 3},

                    {-3, 1, 5, 0},

                    {3, -1, -9, 4}};

  

    int adj[N][N];  // Хранить сопряженный с A [] []

  

    float inv[N][N]; // Для сохранения инверсии A [] []

  

    cout << "Input matrix is :\n";

    display(A);

  

    cout << "\nThe Adjoint is :\n";

    adjoint(A, adj);

    display(adj);

  

    cout << "\nThe Inverse is :\n";

    if (inverse(A, inv))

        display(inv);

  

    return 0;

}

Джава

// Java-программа для поиска сопряженной и обратной матрицы

class GFG

{

      

static final int N = 4;

  
// Функция для получения кофактора A [p] [q] в temp [] []. n является текущим
// размерность A [] []

static void getCofactor(int A[][], int temp[][], int p, int q, int n)

{

    int i = 0, j = 0;

  

    // Цикл для каждого элемента матрицы

    for (int row = 0; row < n; row++)

    {

        for (int col = 0; col < n; col++)

        {

            // Копирование во временную матрицу только тех элементов

            // которые не находятся в данной строке и столбце

            if (row != p && col != q)

            {

                temp[i][j++] = A[row][col];

  

                // Строка заполнена, поэтому увеличиваем индекс строки и

                // сбросить индекс col

                if (j == n - 1)

                {

                    j = 0;

                    i++;

                }

            }

        }

    }

}

  
/ * Рекурсивная функция для нахождения определителя матрицы.
n - текущее измерение A [] []. * /

static int determinant(int A[][], int n)

{

    int D = 0; // Инициализировать результат

  

    // Базовый случай: если матрица содержит один элемент

    if (n == 1)

        return A[0][0];

  

    int [][]temp = new int[N][N]; // Для хранения кофакторов

  

    int sign = 1; // Сохранить множитель знака

  

    // Итерация для каждого элемента первой строки

    for (int f = 0; f < n; f++)

    {

        // Получение кофактора A [0] [f]

        getCofactor(A, temp, 0, f, n);

        D += sign * A[0][f] * determinant(temp, n - 1);

  

        // условия должны быть добавлены с альтернативным знаком

        sign = -sign;

    }

  

    return D;

}

  
// Функция для присоединения A [N] [N] в adj [N] [N].

static void adjoint(int A[][],int [][]adj)

{

    if (N == 1)

    {

        adj[0][0] = 1;

        return;

    }

  

    // temp используется для хранения кофакторов A [] []

    int sign = 1;

    int [][]temp = new int[N][N];

  

    for (int i = 0; i < N; i++)

    {

        for (int j = 0; j < N; j++)

        {

            // Получить кофактор A [i] [j]

            getCofactor(A, temp, i, j, N);

  

            // знак adj [j] [i] положительный, если сумма строки

            // и индексы столбцов четные.

            sign = ((i + j) % 2 == 0)? 1: -1;

  

            // Меняем строки и столбцы, чтобы получить

            // транспонировать матрицу кофактора

            adj[j][i] = (sign)*(determinant(temp, N-1));

        }

    }

}

  
// Функция для вычисления и сохранения обратного, возвращает false, если
// матрица единственного числа

static boolean inverse(int A[][], float [][]inverse)

{

    // Найти определитель A [] []

    int det = determinant(A, N);

    if (det == 0)

    {

        System.out.print("Singular matrix, can't find its inverse");

        return false;

    }

  

    // Найти сопряженное

    int [][]adj = new int[N][N];

    adjoint(A, adj);

  

    // Находим обратное, используя формулу "обратный (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;

}

  
// Универсальная функция для отображения матрицы. Мы используем его для отображения
// как смежные, так и обратные. примыкает целочисленная матрица и обратная
// это число с плавающей точкой

  

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();

    }

}

  
// Драйвер программы

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]; // Хранить сопряженный с A [] []

  

    float [][]inv = new float[N][N]; // Для сохранения инверсии 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);

  
}
}

  
// Этот код предоставлен Rajput-Ji

C #

// C # программа для поиска сопряженной и обратной матрицы

using System;

using System.Collections.Generic;

  

class GFG

{

      

static readonly int N = 4;

  
// Функция для получения кофактора A [p, q] в [,] temp. n является текущим
// размерность [,] A

static void getCofactor(int [,]A, int [,]temp, int p, int q, int n)

{

    int i = 0, j = 0;

  

    // Цикл для каждого элемента матрицы

    for (int row = 0; row < n; row++)

    {

        for (int col = 0; col < n; col++)

        {

            // Копирование во временную матрицу только тех элементов

            // которые не находятся в данной строке и столбце

            if (row != p && col != q)

            {

                temp[i, j++] = A[row, col];

  

                // Строка заполнена, поэтому увеличиваем индекс строки и

                // сбросить индекс col

                if (j == n - 1)

                {

                    j = 0;

                    i++;

                }

            }

        }

    }

}

  
/ * Рекурсивная функция для нахождения определителя матрицы.
n - текущее измерение [,] A. * /

static int determinant(int [,]A, int n)

{

    int D = 0; // Инициализировать результат

  

    // Базовый случай: если матрица содержит один элемент

    if (n == 1)

        return A[0, 0];

  

    int [,]temp = new int[N, N]; // Для хранения кофакторов

  

    int sign = 1; // Сохранить множитель знака

  

    // Итерация для каждого элемента первой строки

    for (int f = 0; f < n; f++)

    {

        // Получение кофактора A [0, f]

        getCofactor(A, temp, 0, f, n);

        D += sign * A[0, f] * determinant(temp, n - 1);

  

        // условия должны быть добавлены с альтернативным знаком

        sign = -sign;

    }

    return D;

}

  
// Функция для присоединения A [N, N] в adj [N, N].

static void adjoint(int [,]A, int [,]adj)

{

    if (N == 1)

    {

        adj[0, 0] = 1;

        return;

    }

  

    // temp используется для хранения кофакторов [,] A

    int sign = 1;

    int [,]temp = new int[N, N];

  

    for (int i = 0; i < N; i++)

    {

        for (int j = 0; j < N; j++)

        {

            // Получить кофактор A [i, j]

            getCofactor(A, temp, i, j, N);

  

            // знак adj [j, i] положительный, если сумма строки

            // и индексы столбцов четные.

            sign = ((i + j) % 2 == 0)? 1: -1;

  

            // Меняем строки и столбцы, чтобы получить

            // транспонировать матрицу кофактора

            adj[j, i] = (sign) * (determinant(temp, N - 1));

        }

    }

}

  
// Функция для вычисления и сохранения обратного, возвращает false, если
// матрица единственного числа

static bool inverse(int [,]A, float [,]inverse)

{

    // Найти определитель [,] A

    int det = determinant(A, N);

    if (det == 0)

    {

        Console.Write("Singular matrix, can't find its inverse");

        return false;

    }

  

    // Найти сопряженное

    int [,]adj = new int[N, N];

    adjoint(A, adj);

  

    // Находим обратное, используя формулу "обратный (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;

}

  
// Универсальная функция для отображения матрицы. Мы используем его для отображения
// как смежные, так и обратные. примыкает целочисленная матрица и обратная
// это число с плавающей точкой

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();

    }

}

  
// Драйвер программы

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]; // Хранить сопряженный из [,] A

  

    float [,]inv = new float[N, N]; // Для хранения инверсии [,] 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);

}
}

  
// Этот код предоставлен 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

Пожалуйста, обратитесь http://espressocode.top/determinant-of-a-matrix/ для получения подробной информации о getCofactor () и определителя ().

Ссылки:
http://espressocode.top/determinant-of-a-matrix/
https://en.wikipedia.org/wiki/Adjugate_matrix

Эта статья предоставлена Ашутошем Кумаром . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Сопряженный и обратный матрицы

0.00 (0%) 0 votes