C++三阶矩阵求逆矩阵

记录一下第一次独立写的代码
感觉自己写的很粗糙,慢慢来吧。

//===================
//三阶矩阵求逆矩阵
//===================

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include<string>
#include<iomanip>
using namespace std;


int i, j;
int main()
{
	//**输入待求矩阵与单位矩阵**//
	double A[3][3] = { { 1,2,3 },{ 1,2,2 },{ 3,4,6 } };   //在此输入待求矩阵
	double E[3][3] = { { 1,0,0 },{ 0,1,0 },{ 0,0,1 } };   //单位矩阵
	cout << "原矩阵为:" << endl;
	
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			cout << A[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	//**计算矩阵行列式,按第一行展开**//
	double Matrix_determinant;
	Matrix_determinant = 
		A[0][0] * (A[1][1] * A[2][2] - A[1][2] * A[2][1]) -
		A[0][1] * (A[1][0] * A[2][2] - A[1][2] * A[2][0]) +
		A[0][2] * (A[1][0] * A[2][1] - A[1][1] * A[2][0]) ;

	//**判断行列式是否为0**//
	if (Matrix_determinant == 0)
	{
		cout << "该矩阵没有逆矩阵" << endl;
		cout << endl;
		system("pause"); 
	}
	else
	{ 
	
		//**将第一行第一个数变为1**//
		double temp1 = A[0][0];
		for (j = 0; j < 3; j++)
		{
			A[0][j] = A[0][j] / temp1;
			E[0][j] = E[0][j] / temp1;
		}
		//行变换-将第二行第一个数变为零
		double temp2 = A[1][0];
		for (j = 0; j < 3; j++)
		{
			A[1][j] = A[1][j] - A[0][j] * temp2;
			E[1][j] = E[1][j] - E[0][j] * temp2;
		}
		//将第三行第一个数变为零
		double temp3 = A[2][0];
		for (j = 0; j < 3; j++)
		{
			A[2][j] = A[2][j] - A[0][j] * temp3;
			E[2][j] = E[2][j] - E[0][j] * temp3;
		}
		//判断第二行第个数是否为0,若为零则将第二行与第三行互换
		double mid1[3] = { A[1][0], A[1][1], A[1][2] };
		double mid2[3] = { E[1][0], E[1][1], E[1][2] };

		if (A[1][1] == 0)
		{
			// 将第三行的数换到第二行
			for (j = 0; j < 3; j++)
			{
				A[1][j] = A[2][j];
				E[1][j] = E[2][j];
			}
			// 将第二行的数换到第三行
			for (j = 0; j < 3; j++)
			{
				A[2][j] = mid1[j];
				E[2][j] = mid2[j];
			}
		}

		//将第二行第二个数化为1
		double temp4 = A[1][1];
		for (j = 0; j < 3; j++)
		{
			A[1][j] = A[1][j] / temp4;
			E[1][j] = E[1][j] / temp4;
		}
		cout << endl;
		//行变换---第三行减去A3_2 倍的第二行---将第三行第二列也变为零
		double temp5 = A[2][1];
		for (j = 0; j < 3; j++)
		{
			A[2][j] = A[2][j] - temp5 * A[1][j];
			E[2][j] = E[2][j] - temp5 * E[1][j];
		}
		//让第三行最后一个数为1
		double temp6 = A[2][2];
		for (j = 0; j < 3; j++)
		{
			A[2][j] = A[2][j] / temp6;
			E[2][j] = E[2][j] / temp6;
		}
		//将第一行第二个数、第三个数与第二行第三个数变为零**//
		//将第二行第三个数变为0
		double temp7 = A[1][2];
		for (j = 0; j < 3; j++)
		{
			A[1][j] = A[1][j] - temp7 * A[2][j];
			E[1][j] = E[1][j] - temp7 * E[2][j];
		}
		//将第一行第三个数变为0
		double temp8 = A[0][2];
		for (j = 0; j < 3; j++)
		{
			A[0][j] = A[0][j] - temp8 * A[2][j];
			E[0][j] = E[0][j] - temp8 * E[2][j];
		}
		//将第一行第二个数变为0
		double temp9 = A[0][1];
		for (j = 0; j < 3; j++)
		{
			A[0][j] = A[0][j] - temp9 * A[1][j];
			E[0][j] = E[0][j] - temp9 * E[1][j];
		}
		//判定--该判定主要解决输出为-0的问题**//
		for (i = 0; i < 3; i++)
		{
			for (j = 0; j < 3; j++)
			{
				if (A[i][j] == 0)
				{
					A[i][j] = 0;
				}
			}
		}
		//**输出最后化简的矩阵**//
		cout << "原矩阵最终化简为:" << endl;
		cout << A[0][0] << " " << A[0][1] << " " << A[0][2] << " " << endl;
		cout << A[1][0] << " " << A[1][1] << " " << A[1][2] << " " << endl;
		cout << A[2][0] << " " << A[2][1] << " " << A[2][2] << " " << endl;
		cout << endl;
		cout << endl;
		//判定--该判定主要解决输出为-0的问题**//
		for (i = 0; i < 3; i++)
		{
			for (j = 0; j < 3; j++)
			{
				if (E[i][j] == 0)
				{
					E[i][j] = 0;
				}
			}
		}
		//**输出最后的逆矩阵**//
		cout << "该矩阵的逆矩阵为:" << endl;
		cout << endl;
		cout << E[0][0] << " " << E[0][1] << " " << E[0][2] << " " << endl;
		cout << E[1][0] << " " << E[1][1] << " " << E[1][2] << " " << endl;
		cout << E[2][0] << " " << E[2][1] << " " << E[2][2] << " " << endl;
		cout << endl;

		system("pause");
		return 0;
	}
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值