ในปัญหานี้ เราได้รับ 2D matrix mat[][] งานของเราคือ หาค่าผกผันของเมทริกซ์โดยใช้วิธีเกาส์จอร์แดน .
ทีนี้มาทำความเข้าใจพื้นฐานของปัญหากัน
MATRIX เป็นอาร์เรย์ของตัวเลขสองมิติ
ตัวอย่าง
$\begin{bmatrix}2&5&4 \\1&6&7 \\9&3&8\end{bmatrix}$
ผกผันของเมทริกซ์ [A-1] −
เป็นการดำเนินการบนเมทริกซ์สี่เหลี่ยมจัตุรัส ต่อไปนี้เป็นคุณสมบัติที่จำเป็นสำหรับเมทริกซ์เพื่อให้มีค่าผกผัน -
-
เมทริกซ์เริ่มต้นควรเป็นเมทริกซ์สี่เหลี่ยมจัตุรัส
-
ต้องเป็นเมทริกซ์ที่ไม่ใช่เอกพจน์
-
เมทริกซ์เอกลักษณ์ที่ฉันมีอยู่สำหรับเมทริกซ์ A นั้น
$$AA^{-1} =A^{-1}.A =I$$
เป็นสูตรที่สามารถใช้หาค่าผกผันของเมทริกซ์ที่ให้มดได้ มันคือ
$A^{-1}\:=\:\left(\frac{adj(A)}{\det(A)}\right)$
adj(A) คือ ส่วนต่อประสานของเมทริกซ์ A
det(A) เป็นดีเทอร์มีแนนต์ของเมทริกซ์ A.
พวกมันมีหลายวิธีที่ใช้กับ เราสามารถหาอินเวอร์สของเมทริกซ์ได้ ในบทความนี้ เราจะมาเรียนรู้เกี่ยวกับ Gauss Jordan Method ซึ่งเรียกอีกอย่างว่า การบังคับแถวเบื้องต้น .
มันเป็นวิธีการทีละขั้นตอนเพื่อค้นหาผกผันของเมทริกซ์ นี่คือขั้นตอนที่เกี่ยวข้อง -
-
การหาเมทริกซ์เสริมโดยใช้เมทริกซ์เอกลักษณ์
-
ค้นหารูปแบบระดับของเมทริกซ์โดยดำเนินการลดแถวบนเมทริกซ์เสริมที่พบในขั้นตอนที่ 1
-
การดำเนินการบางอย่างที่สามารถทำได้บนเมทริกซ์เสริมในกระบวนการคือ
-
การสลับแถว (คุณสามารถเปลี่ยนสองแถวใดก็ได้)
-
การคูณ (แต่ละองค์ประกอบของแถวสามารถคูณด้วยค่าคงที่อื่นที่ไม่ใช่ 0)
-
การแลกเปลี่ยนแถว (แทนที่แถวด้วยผลรวมของแถวและผลคูณค่าคงที่ของเมทริกซ์อีกแถวหนึ่ง)
-
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <iostream>
#include <vector>
using namespace std;
void printMatrixValues(float** arr, int n, int m){
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout<<arr[i][j]<<"\t";
}
cout<<endl;
}
return;
}
void printInverseMatrix(float** arr, int n, int m){
for (int i = 0; i < n; i++) {
for (int j = n; j < m; j++) {
printf("%.3f\t", arr[i][j]);
}
cout<<endl;
}
return;
}
void findInvMatGaussJordan(float** mat, int order){
float temp;
printf("The inverse of matrix : A = \n");
printMatrixValues(mat, order, order);
for (int i = 0; i < order; i++) {
for (int j = 0; j < 2 * order; j++) {
if (j == (i + order))
mat[i][j] = 1;
}
}
for (int i = order - 1; i > 0; i--) {
if (mat[i - 1][0] < mat[i][0]) {
float* temp = mat[i];
mat[i] = mat[i - 1];
mat[i - 1] = temp;
}
}
for (int i = 0; i < order; i++) {
for (int j = 0; j < order; j++) {
if (j != i) {
temp = mat[j][i] / mat[i][i];
for (int k = 0; k < 2 * order; k++) {
mat[j][k] -= mat[i][k] * temp;
}
}
}
}
for (int i = 0; i < order; i++) {
temp = mat[i][i];
for (int j = 0; j < 2 * order; j++) {
mat[i][j] = mat[i][j] / temp;
}
}
cout<<"A' =\n";
printInverseMatrix(mat, order, 2 * order);
return;
}
int main(){
int order = 3;
float** mat = new float*[20];
for (int i = 0; i < 20; i++)
mat[i] = new float[20];
mat[0][0] = 6; mat[0][1] = 9; mat[0][2] = 5;
mat[1][0] = 8; mat[1][1] = 3; mat[1][2] = 2;
mat[2][0] = 1; mat[2][1] = 4; mat[2][2] = 7;
findInvMatGaussJordan(mat, order);
return 0;
} ผลลัพธ์
The inverse of matrix : A = 6 9 5 8 3 2 1 4 7 A' = -0.049 0.163 -0.011 0.205 -0.141 -0.106 -0.110 0.057 0.205