-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinverse_mat_2d-array.cpp
More file actions
116 lines (97 loc) · 2.38 KB
/
inverse_mat_2d-array.cpp
File metadata and controls
116 lines (97 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Inversion of a matrix in done by using 2D array only.
// 1) Imports
#include <iostream>
using namespace std;
// Function to Print matrix.
void printMatrix(float** ar, int n, int m)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << ar[i][j] << " ";
}
printf("\n");
}
return;
}
void printInverse(float** ar, int n, int m)
{
for (int i = 0; i < n; i++) {
for (int j = n; j < m; j++) {
printf("%.3f ", ar[i][j]);
}
printf("\n");
}
return;
}
// Function to perform the inverse operation on the matrix.
void InverseOfMatrix(float** matrix, int order)
{
// Matrix Declaration.
float temp;
// printMatrix function to print the element of the matrix.
printf("=== Matrix ===\n");
printMatrix(matrix, order, order);
// Create the augmented matrix
// Add the identity matrix of order at the end of original matrix.
for (int i = 0; i < order; i++) {
for (int j = 0; j < 2 * order; j++) {
// Add '1' at the diagonal places of the matrix to create a identity matrix
if (j == (i + order))
matrix[i][j] = 1;
}
}
printf("\n=== Augmented Matrix ===\n");
printMatrix(matrix, order, order * 2);
// Replace a row by sum of itself and a constant multiple of another row of the matrix
for (int i = 0; i < order; i++) {
for (int j = 0; j < order; j++) {
if (j != i) { // if not main diagonal
temp = matrix[j][i] / matrix[i][i];
for (int k = 0; k < 2 * order; k++) {
matrix[j][k] -= matrix[i][k] * temp;
}
}
}
}
// Multiply each row by a nonzero integer.
// Divide row element by the diagonal element
for (int i = 0; i < order; i++) {
temp = matrix[i][i];
for (int j = 0; j < 2 * order; j++) {
matrix[i][j] = matrix[i][j] / temp;
}
}
// print the resultant Inverse matrix.
printf("\n=== Inverse Matrix ===\n");
printInverse(matrix, order, 2 * order);
return;
}
// Driver code
int main()
{
int order;
// Order of the matrix
// The matrix must be a square a matrix
order = 3;
/*
float matrix[20][20] = { { 5, 7, 9 },
{ 4, 3, 8 },
{ 7, 5, 6 },
{ 0 } };
*/
float** matrix = new float*[20];
for (int i = 0; i < 20; i++)
matrix[i] = new float[20];
matrix[0][0] = 5;
matrix[0][1] = 7;
matrix[0][2] = 9;
matrix[1][0] = 4;
matrix[1][1] = 3;
matrix[1][2] = 8;
matrix[2][0] = 7;
matrix[2][1] = 5;
matrix[2][2] = 6;
// Get the inverse of matrix
InverseOfMatrix(matrix, order);
return 0;
}