5.17MY逆矩阵代码出世了!!
前面在求三角形的外心的时候寸步难行,不知道如何下手,有没找到已封装的函数,自能自己推了。头疼啊!!
后面经过换算,发现此问题的关键之处就在于求矩阵的逆,于是就有了下面的东西。因为我是用于求外心,所以针对的是2阶矩阵,如果是针对高阶的,请自己对代码进行稍加修改即可,思路都一样。
谢谢大家的分享!!(不知道什么原因图片没有显示出来,下面留言有图片!)
代码如下:
#include <iostream>
#include <iomanip.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//#include <cmath>
//using namespace std;
void main()
{
int m_size=2; //定义矩阵维数
double A[2][2]={2,5,4,0}; //定义初始矩阵
//int m_size=sizeof(A); //定义矩阵维数
double inA[2][2]={0}; //定义逆矩阵
double InitMatrix[2][2*2]={0}; //定义增广矩阵
for(int i=0;i<=m_size-1;i++) //赋值给增广矩阵
{
for(int j=0;j<=m_size*2-1;j++)
{
if (j<=m_size-1)
{
InitMatrix[i][j]=A[i][j];
}
else if (j==m_size+i)
InitMatrix[i][j]=1;
else
InitMatrix[i][j]=0;
}
}
cout<<"原矩阵如下:"<<endl;
//输出矩阵
for(int ii=0;ii<=m_size-1;ii++) //赋值给增广矩阵
{
cout<<setiosflags(ios::right)<<endl; //输出格式设定
for(int jj=0;jj<=m_size-1;jj++)
{
cout<<setw(12)<<InitMatrix[ii][jj];
}
}
cout<<endl;
//用初等变换求逆(A E)->(E inA)
//从第i行选取主元;
for(int iline=0;iline<=m_size-1;iline++)
{
int maxLine=iline;
double maxMember=InitMatrix[iline][iline];
for(int line=iline;line<=m_size-1;line++)
{
if(fabs(InitMatrix[line][iline])>fabs(maxMember))
{
maxLine=line;
maxMember=InitMatrix[line][iline];
}
}
if(maxMember==0)
{
cout<<"error 该矩阵不可逆!....\n";
exit(-1);
}
for(int row=0;row<=2*m_size-1;row++) //将绝对值最大的列元素换到相应对角位置
//swap(InitMatrix[maxLine][row],InitMatrix[iline][row]);
{
double swaptemp=InitMatrix[maxLine][row];
InitMatrix[maxLine][row]=InitMatrix[iline][row];
InitMatrix[iline][row]=swaptemp;
}
double max_linetemp=InitMatrix[iline][iline];
for(int x=0;x<=2*m_size-1;x++)
InitMatrix[iline][x]=InitMatrix[iline][x]/max_linetemp; //将对角线的元素化1
for(int kk=iline+1;kk<=m_size-1;kk++)
{
double temptemp=InitMatrix[kk][iline];
for(int k=iline;k<=2*m_size-1;k++) //其他列元素化为0
{
InitMatrix[kk][k]=InitMatrix[kk][k]-InitMatrix[iline][k]*temptemp;
}
}
}
////////////////////////////////从m_size-1列往回,把非对角元素化为0
for (int ri=m_size-1;ri>=1;--ri)
{
for (int rj=0;rj<=ri-1;++rj) //循环从0行到ri-1行
{
double rtemp=InitMatrix[rj][ri];
for (int rx=ri;rx<=2*m_size-1;++rx)
{
InitMatrix[rj][rx]=InitMatrix[rj][rx]-InitMatrix[ri][rx]*rtemp;
}
}
}
//
cout<<"逆矩阵如下:"<<endl;
for(int iiiii=0;iiiii<=m_size-1;iiiii++)
{
cout<<setiosflags(ios::right)<<endl;
for(int jjjjj=m_size;jjjjj<=m_size*2-1;jjjjj++)
{
cout<<setw(12)<<InitMatrix[iiiii][jjjjj];
}
}
cout<<endl;
}
浙公网安备 33010602011771号