是否还在困扰,将矩阵化为行最简型矩阵的时候总是出错?是否还在生气,妥善保管的答案不见踪迹?没事,这个代码将帮你把这些问题一网打尽。通过自己设定矩阵的行数与列数,输入一个矩阵,使其输出行最简型矩阵,亲测无误奥。话不多说,来看看吧!
一、整体思路
第一步:输入矩阵
输入矩阵首先得确定矩阵的行数与列数,这里利用两个宏定义。其次再利用二维数组,输入矩阵,存储矩阵数据。
第二步:化为行阶梯型矩阵
这部分代码也很重要,化为行阶梯型矩阵是为化为行最简型矩阵做铺垫。这里需要利用数学概念,根据行阶梯型矩阵的定义,即应使得每行首非零元素所在列下方全为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]或者进一步优化运算的算法。