N是二维数组的大小
a是转化前的数组
b为转化后的数组
matrix_inverse(a, b); //求逆函数
#include<iostream>
#include<math.h>
#define N 3
using namespace std;
void matrix_inverse(double(*a)[N], double(*b)[N]);
int main()
{
using namespace std;
int i, j;
double a[N][N] = { 1,2,3,2,5,4,3,7,9 };
double b[N][N] = { 0 };
matrix_inverse(a, b); //求逆函数
cout << "the inverse matrix is :\n";
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
cout << " " << b[i][j] << "\t";
}
cout << "\n";
}
return 0;
}
void matrix_inverse(double(*a)[N], double(*b)[N])
{
using namespace std;
int i, j, k;
double max, temp;
// 定义一个临时矩阵t
double t[N][N];
// 将a矩阵临时存放在矩阵t[n][n]中
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
t[i][j] = a[i][j];
}
}
// 初始化B矩阵为单位矩阵
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
b[i][j] = (i == j) ? (double)1 : 0;
}
}
// 进行列主消元,找到每一列的主元
for (i = 0; i < N; i++)
{
max = t[i][i];
// 用于记录每一列中的第几个元素为主元
k = i;
// 寻找每一列中的主元元素
for (j = i + 1; j < N; j++)
{
if (fabs(t[j][i]) > fabs(max))
{
max = t[j][i];
k = j;
}
}
//cout<<"the max number is "<<max<<endl;
// 如果主元所在的行不是第i行,则进行行交换
if (k != i)
{
// 进行行交换
for (j = 0; j < N; j++)
{
temp = t[i][j];
t[i][j] = t[k][j];
t[k][j] = temp;
// 伴随矩阵B也要进行行交换
temp = b[i][j];
b[i][j] = b[k][j];
b[k][j] = temp;
}
}
if (t[i][i] == 0)
{
cout << "\nthe matrix does not exist inverse matrix\n";
break;
}
// 获取列主元素
temp = t[i][i];
// 将主元所在的行进行单位化处理
//cout<<"\nthe temp is "<<temp<<endl;
for (j = 0; j < N; j++)
{
t[i][j] = t[i][j] / temp;
b[i][j] = b[i][j] / temp;
}
for (j = 0; j < N; j++)
{
if (j != i)
{
temp = t[j][i];
//消去该列的其他元素
for (k = 0; k < N; k++)
{
t[j][k] = t[j][k] - temp * t[i][k];
b[j][k] = b[j][k] - temp * b[i][k];
}
}
}
}
}
C++矩阵求逆
最新推荐文章于 2024-04-23 12:34:54 发布