C++将矩阵转换为行最简型矩阵

是否还在困扰,将矩阵化为行最简型矩阵的时候总是出错?是否还在生气,妥善保管的答案不见踪迹?没事,这个代码将帮你把这些问题一网打尽。通过自己设定矩阵的行数与列数,输入一个矩阵,使其输出行最简型矩阵,亲测无误奥。话不多说,来看看吧!


一、整体思路

第一步:输入矩阵

输入矩阵首先得确定矩阵的行数与列数,这里利用两个宏定义。其次再利用二维数组,输入矩阵,存储矩阵数据。

第二步:化为行阶梯型矩阵

这部分代码也很重要,化为行阶梯型矩阵是为化为行最简型矩阵做铺垫。这里需要利用数学概念,根据行阶梯型矩阵的定义,即应使得每行首非零元素所在列下方全为0。
代码整体思路为从矩阵的第一行开始,到矩阵的最后一行结束,循环使每一行都除以该行首非零元素(方便计算),并与其下几行数据对应地进行加减,使其该行首非零元素所在列下面数据都为0。

第三步:化为行最简型矩阵

根据行最简型矩阵的概念,应使得每行首非零元素为1,并使其所在一列除该元素外均为0。
代码整体思路为利用已有的化为行最简型的代码,从最后一行开始,到第一行结束,循环使每一行首非零元素(经过上个代码,均已为1)都与其上几行数据对应地进行加减,使其该行首非零元素所在列除该元素都为0。

第四步:输出矩阵

直接将之前存储并修改后的二维数组直接输出即可。

二、整体代码

代码如下:

#include <iostream>
#include <iomanip>
#include<math.h>
#define row 3
#define col 4
using namespace std;
//第一步:输入矩阵
//第二部:化为行阶梯型矩阵
//第三步:化为行最简型矩阵
//第四步:输出矩阵
class Matrix
{
    
    
	public:
	Matrix(){
    
      };
	void input();
	void row_echelo_form(); 		//化为行阶梯型矩阵
	void row_simplest_form();		//化为行最简型矩阵
	void output(); 
	~Matrix(){
    
      };
	private:
	double a[row][col];
};
void Matrix :: input()
{
    
    
	cout<<"请输入矩阵:"<<endl; 
	for(int i=0;i<row;i++)
	{
    
       
		for(int j=0;j<col;j++)
		{
    
    
			cin>>a[i][j];
		}
		cout<<endl;
	}
}
void Matrix :: row_echelo_form()
{
    
    
	//p与q控制循环从第一行到最后一行,i与j存储位置方便计算;
	int p=0,q=0; 
	for(;p<row-1;)
  {
    
     
	//将该行首非零元素化为1,方便计算;
	while(a[p][q]==0)
	{
    
    
		++q;
	}
	//存储该行首非零元素; 
	double s=a[p][q];
	//将该行元素都除以该行首非零元素,使首非零元素为1; 
	if(a[p][q]!=1 & s!=0) 
	for(int j=q;j<col;j++)
	{
    
    	
		int i=p;
		a[i][j]=a[i][j]/s;		
	}
	//将第该行首零元素下面元素全化为0;	因该行首非零元素为1,计算便捷;						
	for(int i=p+1;i<row;i++)
	{
    
    
		int j=q;
		if(a[i][j]!=0) 
		{
    
    
			double b[col];
			for(int n=0;n<col;n++)
			b[n]=a[p][n]; 
			for(int n=0;n<col;n++)
			b[n]=b[n]*(-1)*a[i][q];
			for(int n=0;n<col;n++)
			a[i][n]=b[n]+a[i][n];
		}
	}
	++p;++q; 
  }
}
void Matrix :: row_simplest_form()
{
    
    
	//p与q控制循环从最后一行到第一行,i与j存储位置方便计算;
	int p=row-1,q=col-1; 
	for(;p>=0;)
  {
    
    
	//查找每行首非零元素;  	
  	while(a[p][q]!=0)
	{
    
    
		--q;
	}
	q++;
	//将该行首非零元素一列化为0;因该行首非零元素为1,计算便捷;	
	for(int i=p-1;i>=0;i--)
	{
    
    
		int j=q;
		if(a[i][j]!=0)
		{
    
    
			double b[col];
			for(int n=0;n<col;n++)
			b[n]=a[p][n];
			for(int n=0;n<col;n++)
			b[n]=b[n]*(-1)*a[i][q];
			for(int n=0;n<col;n++)
			a[i][n]=b[n]+a[i][n];
		}
	}
	p--;q--;
  }
}
void Matrix :: output()
{
    
    
	for(int i=0;i<row;i++)
	{
    
       
		for(int j=0;j<col;j++)
		{
    
    
			cout<<a[i][j]<<setw(4);
		}
		cout<<endl;
	}
}
int main()
{
    
    
	Matrix A;
	A.input();
	cout<<"您输入的矩阵为:"<<endl<<setw(4);
	A.output();cout<<endl;
	A.row_echelo_form();
	cout<<"化为行阶梯型矩阵为:"<<endl<<setw(4);
	A.output();cout<<endl;
	A.row_simplest_form();
	cout<<"化为行最简型矩阵为:"<<endl<<setw(4);
	A.output();cout<<endl;
	A.~Matrix();
	return 0;
}

三、总结

本代码目标明确,即实现矩阵的输入输出,同时通过行阶梯型矩阵化为行最简型矩阵。难点为行阶梯型矩阵的处理,实现每行首非零元素化为1并且依次进行行之间的加减是整个算法的核心。
缺点为,无法处理较大数字矩阵以及极个别数据,因可能出现分数相除除不尽的情况。
改进措施,创建Fraction分数类,创建Fraction类的二维数组a[row][col]或者进一步优化运算的算法。

猜你喜欢

转载自blog.csdn.net/TaloyerG/article/details/112983845