Inv
Tính ma trận nghịch đảo nhân của một ma trận vuông khả nghịch bằng phương pháp Jordan-Gauss.
cpp
matrix matrix::Inv()
1
Giá trị trả về
Ma trận nghịch đảo nhân của ma trận.
Ghi chú
- Tích của ma trận gốc và ma trận nghịch đảo là ma trận đơn vị.
- Nếu ít nhất một hàng hoặc cột của ma trận bằng 0, không thể thu được ma trận nghịch đảo.
- Nếu hai hoặc nhiều hàng hoặc cột của ma trận phụ thuộc tuyến tính, không thể thu được ma trận nghịch đảo.
Ví dụ
cpp
int TestInverse(const int size_m)
{
int i,j,errors=0;
matrix matrix_a(size_m,size_m);
//--- điền vào ma trận vuông
MatrixTestFirst(matrix_a);
//--- đo thời gian bằng micro giây
ulong t1=GetMicrosecondCount();
//--- lấy ma trận nghịch đảo
matrix inverse=matrix_a.Inv();
//--- đo
ulong t2=GetMicrosecondCount();
//--- kiểm tra tính đúng đắn
matrix identity=matrix_a.MatMul(inverse);
//---
for(i=0; i<size_m; i++)
{
for(j=0; j<size_m; j++)
{
double value;
//--- các số 1 phải nằm dọc theo đường chéo
if(i==j)
value=1.0;
else
value=0.0;
if(MathClassify(identity[i][j])>FP_ZERO)
errors++;
else
{
if(identity[i][j]!=value)
{
double diff=MathAbs(identity[i][j]-value);
//--- quá nhiều phép nhân và chia, vì vậy giảm độ chính xác kiểm tra
if(diff>1e-9)
errors++;
}
}
}
}
//---
double elapsed_time=double(t2-t1)/1000.0;
printf("Inversion of matrix %d x %d %s errors=%d time=%.3f ms",size_m,size_m,errors==0?"passed":"failed",errors,elapsed_time);
return(errors);
}
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
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