一、矩阵求逆算法
本次实现矩阵求逆的算法为伴随矩阵法
代数余子式求逆矩阵:如果矩阵A可逆,则
A
−
1
=
A
∗
∣
A
∣
A^{-1} = \frac{A^{*}}{|A|}
A−1=∣A∣A∗
(|A| != 0) ,|A|为该矩阵对应的行列式的值
设三阶矩阵A
A
=
[
a
b
c
d
e
f
g
h
i
]
A=\left[ \begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right]
A=⎣⎡adgbehcfi⎦⎤
1、首先求出伴随矩阵
A
∗
=
[
e
i
−
h
f
h
c
−
b
i
b
f
−
c
e
f
g
−
i
d
i
a
−
c
g
c
d
−
a
f
d
h
−
g
e
g
b
−
a
h
a
e
−
b
d
]
A^{*}=\left[ \begin{matrix} ei-hf & hc-bi & bf-ce \\ fg-id & ia-cg & cd-af \\ dh-ge & gb-ah & ae-bd \end{matrix} \right]
A∗=⎣⎡ei−hffg−iddh−gehc−biia−cggb−ahbf−cecd−afae−bd⎦⎤
将矩阵 A 中的数值带入即可得出伴随矩阵
2、求出其行列式的值
∣
A
∣
=
a
e
i
+
b
f
g
+
c
d
h
−
c
e
g
−
b
d
i
−
a
f
h
|A| = aei + bfg+cdh-ceg-bdi-afh
∣A∣=aei+bfg+cdh−ceg−bdi−afh
3、将结果带入式
A
−
1
=
A
∗
∣
A
∣
A^{-1} = \frac{A^{*}}{|A|}
A−1=∣A∣A∗
中即可得出矩阵的逆
二、矩阵求逆的代码实现
1、按照上述方式,首先求出矩阵的伴随矩阵
—首先定义一个3X3的二维数组表示一个矩阵—
double[,] input = new double[3, 3]; //初始矩阵
double[,] output = new double[3, 3]; //矩阵的逆
———求出伴随矩阵——
output[0, 0] = input[2, 2] * input[1, 1] - input[2, 1] * input[1, 2];
output[0, 1] = input[2, 1] * input[0, 2] - input[0, 1] * input[2, 2];
output[0, 2] = input[0, 1] * input[1, 2] - input[0, 2] * input[1, 1];
output[1, 0] = input[1, 2] * input[2, 0] - input[2, 2] * input[1, 0];
output[1, 1] = input[2, 2] * input[0, 0] - input[0, 2] * input[2, 0];
output[1, 2] = input[0, 2] * input[1, 0] - input[0, 0] * input[1, 2];
output[2, 0] = input[1, 0] * input[2, 1] - input[2, 0] * input[1, 1];
output[2, 1] = input[2, 0] * input[0, 1] - input[0, 0] * input[2, 1];
output[2, 2] = input[0, 0] * input[1, 1] - input[1, 0] * input[0, 1];
———————求出行列式的值———————
double Avalue = input[0, 0] * input[1, 1] * input[2, 2]
+ input[0, 1] * input[1, 2] * input[2, 0]
+ input[0, 2] * input[1, 0] * input[2, 1]
- input[0, 2] * input[1, 1] * input[2, 0]
- input[0, 1] * input[1, 0] * input[2, 2]
- input[0, 0] * input[1, 2] * input[2, 1];
———————求出 逆矩阵 ———————
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
output[i, j] = output[i, j] / Avalue;
}
}
得出 output[ i , j ] 即为**矩阵的逆**
以下完整代码
public static double[,] inv3(double[,] input)
{
double[,] output = new double[3, 3];
output[0, 0] = input[2, 2] * input[1, 1] - input[2, 1] * input[1, 2];
output[0, 1] = input[2, 1] * input[0, 2] - input[0, 1] * input[2, 2];
output[0, 2] = input[0, 1] * input[1, 2] - input[0, 2] * input[1, 1];
output[1, 0] = input[1, 2] * input[2, 0] - input[2, 2] * input[1, 0];
output[1, 1] = input[2, 2] * input[0, 0] - input[0, 2] * input[2, 0];
output[1, 2] = input[0, 2] * input[1, 0] - input[0, 0] * input[1, 2];
output[2, 0] = input[1, 0] * input[2, 1] - input[2, 0] * input[1, 1];
output[2, 1] = input[2, 0] * input[0, 1] - input[0, 0] * input[2, 1];
output[2, 2] = input[0, 0] * input[1, 1] - input[1, 0] * input[0, 1];
double Avalue = input[0, 0] * input[1, 1] * input[2, 2]
+ input[0, 1] * input[1, 2] * input[2, 0]
+ input[0, 2] * input[1, 0] * input[2, 1]
- input[0, 2] * input[1, 1] * input[2, 0]
- input[0, 1] * input[1, 0] * input[2, 2]
- input[0, 0] * input[1, 2] * input[2, 1];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
output[i, j] = output[i, j] / Avalue;
}
}
return output;
}