逆阵求逆(3*3的二维矩阵)
题目:对一个二维矩阵进行求逆操作
输入形式:一个二维矩阵
输出形式:该矩阵的逆矩阵
运行结果:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
int InitialMatrix[110][110];//初始矩阵,即输入的矩阵
int CurrentMatrix[110][110];//当前 矩阵 多用来表示当前余子式
//打印矩阵matrix
void print(int matrix[][110], int n)//打印矩阵
{
int i, j;
for ( i = 1; i <= n; i++)
{
for (j = 1; j < n; j++)
printf("%d ", matrix[i][j]);
printf("%d\n", matrix[i][j]);
}
}
//得到矩阵matrix第numi行第numj列的余子式 并存入到CurrentMatrix中
void GetCurrentMatrix(int numi, int numj, int matrix[][110], int MatrixSize)
{
//tempMatrix为临时矩阵
int tempMatrix[110][110];
int i, j;
//先全部置为1
for ( i = 0; i < MatrixSize + 10; i++)
{
for ( j = 0; j < MatrixSize + 10; j++)
tempMatrix[i][j] = 1;
}
for ( i = 1; i <= MatrixSize - 1; i++)//求余子式矩阵
{
for ( j = 1; j <= MatrixSize - 1; j++)
{
if (i >= numi && j < numj)
tempMatrix[i][j] = matrix[i + 1][j];
else if (i >= numi && j >= numj)
tempMatrix[i][j] = matrix[i + 1][j + 1];
else if (i < numi && j >= numj)
tempMatrix[i][j] = matrix[i][j + 1];
else if (i < numi && j < numj)
tempMatrix[i][j] = matrix[i][j];
}
}
//临时矩阵tempMatrix赋值给 当前矩阵CurrentMatrix
for ( i = 0; i <= MatrixSize - 1; i++)
{
for ( j = 0; j <= MatrixSize - 1; j++)
CurrentMatrix[i][j] = tempMatrix[i][j];
}
}
//求当前行列式为CurrentMatrix时,CurrentMatrix的值。
int GetMatrixValue(int MatrixSize)
{
int matrix[110][110];
int i, j;
int Matrixvalue = 0;//CurrentMatrix的值
//赋值给matrix 交给matrix去计算 防止破坏CurrentMatrix
for ( i = 1; i <= MatrixSize; i++)
{
for ( j = 1; j <= MatrixSize; j++)
matrix[i][j] = CurrentMatrix[i][j];
}
//一阶二阶 行列式求值
if (MatrixSize == 2)
return matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2][1];
else if (MatrixSize == 1)
return matrix[1][1];
else//高阶行列式求值
{
for ( i = 1; i <= MatrixSize; i++)
{
GetCurrentMatrix(1, i, matrix, MatrixSize);//得到第一行 第i列 的 当前余子式 CurrentMatrix
if (i % 2 == 1)//因为 是 行项为1 所以 列项i为奇数时 逆序数为偶数
Matrixvalue += matrix[1][i] * GetMatrixValue(MatrixSize - 1);
else
Matrixvalue -= matrix[1][i] * GetMatrixValue(MatrixSize - 1);
}
return Matrixvalue;
}
}
int gcd(int m, int n)//求逆矩阵时约分
{
if (m < n)
gcd(n, m);
if (n == 0)
return m;
else
return gcd(n, m % n);
}
//打印当前两个值相除得到的最简分数
void final(int n, int m)
{
if (n * m < 0)
{
printf("-");
final(fabs(n), fabs(m));
return;
}
//printf("%d %d /%d\n",n,m,gcd(n,m));
if (m == 1)
printf("%d ", n);
else if (n % m == 0)
printf("%d ", n / m);
else
printf("%d/%d ", n / gcd(n, m), m / gcd(n, m));
}
int main()
{
int MatrixSize = 3;//矩阵的size
int TransposeMatrixValue;
int i = 0, j = 0;
int MatrixValue = 0;
int TransposeMatrix[110][110];//转置行列式
//printf("please input the determinant`s size:\n");//输入矩阵的规格
//scanf("%d", &MatrixSize);
//初始数组 全部 置为 1
for ( i = 0; i < MatrixSize + 10; i++)
{
for (int j = 0; j < MatrixSize + 10; j++)
InitialMatrix[i][j] = 1;
}
printf("输入%d*%d矩阵:\n", MatrixSize, MatrixSize);//输入矩阵
for ( i = 1; i <= MatrixSize; i++)
{
for ( j = 1; j <= MatrixSize; j++)
{
scanf("%d", &InitialMatrix[i][j]);
CurrentMatrix[i][j] = InitialMatrix[i][j];//CurrentMatrix即 为当前矩阵
}
}
MatrixValue = GetMatrixValue(MatrixSize);//矩阵的值
for (i = 1; i <= MatrixSize; i++)//求转置行列式
{
for (j = 1; j <= MatrixSize; j++)
{
TransposeMatrix[i][j] = InitialMatrix[j][i];
CurrentMatrix[i][j] = TransposeMatrix[i][j];
}
}
TransposeMatrixValue = GetMatrixValue(MatrixSize);
//printf("%d\n", TransposeMatrixValue);
if (TransposeMatrixValue == 0)
{
printf("该矩阵无逆矩阵!!!\n");
return 0;//矩阵值为0,无逆矩阵
}
printf("逆矩阵:\n");//输出逆矩阵
for ( i = 1; i <= MatrixSize; i++)
{
for ( j = 1; j <= MatrixSize; j++)
{
GetCurrentMatrix(i, j, TransposeMatrix, MatrixSize);//得到转置矩阵第i行第j列的 余子式 存入到CurrentMatrix里边
if ((i + j) % 2 == 0)
final(GetMatrixValue(MatrixSize - 1), MatrixValue);
else
final(-1 * GetMatrixValue(MatrixSize - 1), MatrixValue);
}
printf("\n");
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!