【计算任意维度矩阵逆矩阵】
发布时间
阅读量:
阅读量
矩阵求逆
该文介绍了一种用于计算矩阵逆的方法,并将其定义为基于(伴随矩阵+代数余子式)的具体实现过程。该方法的主要步骤包括:①计算目标矩阵的行列式的值;②求解目标矩阵对应的伴随矩阵的内容。整个过程涉及三个核心组件:
该文介绍了一种用于计算矩阵逆的方法,并将其定义为基于(伴随矩阵+代数余子式)的具体实现过程。该方法的主要步骤包括:①计算目标矩阵的行列式的值;②求解目标矩阵对应的伴随矩阵的内容。整个过程涉及三个核心组件:
- detValue(double **arr, int n) // 计算给定矩阵的行列式值
- cofactorMatrix(double** arr, double** cofactorArr, int n) // 删除第r行及第w列后得到子矩阵
- inverseMatrix(double** srcMatrix, double** invMatrix, int n) // 用于求取给定原始矩阵对应的逆阵
计算矩阵行列式
//======================================================
//计算矩阵arr的行列式,d为矩阵的维度
//======================================================
double Det(double **arr, int d)
{
int i;
double sum = 0;
if (d == 1)
{
sum = arr[0][0];
}
else if (d == 2)
{
sum = arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
}
else if (d == 3)
{
sum = arr[0][0] * arr[1][1] * arr[2][2]
+ arr[0][1] * arr[1][2] * arr[2][0]
+ arr[1][0] * arr[2][1] * arr[0][2]
- arr[0][2] * arr[1][1] * arr[2][0]
- arr[0][1] * arr[1][0] * arr[2][2]
- arr[1][2] * arr[2][1] * arr[0][0];
}
else
{
double** arr2 = (double**)malloc(sizeof(double*) * (d - 1));
if (arr2 != NULL)
{
for (i = 0; i < d - 1; i++)
{
arr2[i] = (double*)malloc(sizeof(double) * (d - 1));
}
}
for (i = 0; i < d; i++)
{
if (arr[0][i] != 0)
{
Cof(arr, arr2, d, 0, i);
sum += pow(-1, i + 2) * arr[0][i] * Det(arr2, d - 1);
}
}
for (i = 0; i < d - 1; i++) // 释放所申请的内存
{
free(arr2[i]);
}
free(arr2);
}
return sum;
}
//================================================================
//计算矩阵arr去除r行w列的后的余子矩阵,并将结果存储于arr2矩阵中
//================================================================
void Cof(double** arr, double** arr2, int d, int r, int w)
{
int i, j, m, n;
m = 0;
for (i = 0; i < d; i++)
{
if (i == r) continue;
n = 0;
for (j = 0; j < d; j++)
{
if (j == w) continue;
arr2[m][n] = arr[i][j];
n++;
}
m++;
}
}
cpp

计算矩阵逆矩阵
//======================================================
//计算矩阵src的逆矩阵,将结果保存于dst,d为矩阵的维度
//======================================================
void InverseMat(double** src, double **dst, int d)
{
double t = Det(src, d); //计算矩阵src的行列式
double a = 1.0 / Det(src, d);
int i, j;
double** arr2 = (double**)malloc(sizeof(double*) * (d - 1));
if (arr2 != NULL)
{
for (i = 0; i < d - 1; i++)
{
arr2[i] = (double*)malloc(sizeof(double) * (d - 1));
}
}
for (i = 0; i < d; i++)
{
for (j = 0; j < d; j++)
{
Cof(src, arr2, d, i, j);
double b = pow(-1, i + j) * Det(arr2, d - 1);
dst[j][i] = a * b;
}
}
for (i = 0; i < d - 1; i++) // 释放所申请的内存
{
free(arr2[i]);
}
free(arr2);
}
cpp

全部评论 (0)
还没有任何评论哟~
