- 对于 n n n阶矩阵 A A A,如果有 n n n阶矩阵 B B B,使 A B = B A = E AB=BA=E AB=BA=E,则说 A A A是可逆的,并把 B B B称为 A A A的逆矩阵.
- A A A的逆矩阵记作 A − 1 A^{-1} A−1,则 B = A − 1 B=A^{-1} B=A−1.
- 若 ∣ A ∣ ≠ 0 \begin{vmatrix}A\end{vmatrix} \neq 0 A =0,则 A A A可逆,且 A − 1 = 1 ∣ A ∣ A ∗ A^{-1}= \frac{1}{\begin{vmatrix}A \end{vmatrix}}A^* A−1=∣A∣1A∗.
- 上式中, ∣ A ∣ \begin{vmatrix}A\end{vmatrix} A 为 A A A的行列式, A ∗ A^* A∗为 A A A的伴随矩阵.
为便于管理函数,建立行列式类CDeterminant.
//在CDeterminant.h声明成员函数
static bool GetDetRem
(
const vector<vector<double>> &vvDetInput, //原始行列式
int i, //待求余子式元素的行号
int j, //待求余子式元素的列号
vector<vector<double>> &vvDetRet //求得的余子式
);
//在CDeterminant.cpp中定义成员函数
bool CDeterminant::GetDetRem
(
const vector<vector<double>> &vvDetInput,
int i,
int j,
vector<vector<double>> &vvDetRet
)
{
if (false == IsDet(vvDetInput))//形参是否符合行列式格式要求
return false;
vvDetRet.clear();
vvDetRet = vvDetInput;
//删除元素所在的行
vvDetRet.erase(vvDetRet.cbegin() + i);
for (int i = 0; i < vvDetRet.size(); i++)
{
//删除元素所在的列
vvDetRet[i].erase(vvDetRet[i].cbegin() + j);
}
return true;
}
//在CMatrix.h中声明成员函数
static bool GetAdjointMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvMatRet
);
//在CMatrix.cpp中定义成员函数
bool CMatrix::GetAdjointMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvMatRet
)
{
//判断vector变量是否符合行列式格式
if (false == CDeterminant::IsDet(vvMatInput))
return false;
vvMatRet.clear();
vector<double> vTemp;//临时存储伴随矩阵的行元素
vector<vector<double>> vvDetTemp;//临时存储余子式
double iDetValTemp;//临时存储余子式的值
//按列循环
for (int i = 0; i < vvMatInput[0].size(); i++)
{
vTemp.clear();
//按行循环
for (int j = 0; j < vvMatInput.size(); j++)
{
//求余子式
vvDetTemp.clear();
CDeterminant::GetDetRem(vvMatInput, j, i, vvDetTemp);
//余子式求值
iDetValTemp = 0;
CDeterminant::GetDetValByDef(vvDetTemp, iDetValTemp);
//求代数余子式
iDetValTemp = (pow(-1, i + j) * iDetValTemp);
//代数余子式的值填入新矩阵的行元素中
vTemp.push_back(iDetValTemp);
}
//行元素填入新矩阵中
vvMatRet.push_back(vTemp);
}
return true;
}
//在CMatrix.h中声明函数
static bool GetInverseMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvInverseMat
);
//在CMatrix.cpp中定义函数
bool CMatrix::GetInverseMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvInverseMat
)
{
if (false == CDeterminant::IsDet(vvMatInput))
return false;
//方阵行列式值不等于0时,方阵可逆
double fDetVal;
CDeterminant::GetDetValByDef(vvMatInput, fDetVal);
if (0 == fDetVal)
return false;
fDetVal = 1.0 / fDetVal;
vector<vector<double>> vvMatTemp;
GetAdjointMat(vvMatInput, vvMatTemp);//求伴随矩阵
vvInverseMat.clear();
MatMulti(fDetVal, vvMatTemp, vvInverseMat);//求数与矩阵相乘
return true;
}
//在test.cpp中测试
#include
#include
#include
#include "CMatrix.h"
using namespace std;
bool PrintMat
(
const vector<vector<double>> &vvMat
)
{
for (int i = 0; i < vvMat.size(); i++)
{
for (int j = 0; j < vvMat[i].size(); j++)
{
cout << setw(5) << vvMat[i][j];
}
cout << endl;
}
return true;
}
int main()
{
vector<vector<double>> vvMatA{{ 1, 2, 3},
{ 2, 2, 1},
{ 3, 4, 3}};
vector<vector<double>> vvMatRet;
if (false == CMatrix::GetInverseMat(vvMatA, vvMatRet))
{
cout << "计算失败" << endl;
}
else
{
PrintMat(vvMatRet);
}
return 0;
}
