您的位置:首页 > 编程语言 > C语言/C++

线性代数-矩阵-【5】矩阵化简 C和C++实现

2017-09-01 19:52 381 查看
点击这里可以跳转至

【1】矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html

【2】矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html

【3】矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html

【4】矩阵点乘:http://www.cnblogs.com/HongYi-Liang/p/7287324.html

【5】矩阵化简:现在的位置

(待续)

...

C++语言:

高斯消元法:

继续使用这个矩阵

template <typename T>
bool Matrix<T>::rrefmovie()
{
Matrix<T> outputMatrix = *this;
int rank=0;//the rank of the matrix, how many columns's pivot will it has(-1)

/*Gauss elmiation*/
cout<<"Gauss elimination:"<<endl;
outputMatrix.printfAll();
for(int k=0;k<outputMatrix.m_iRows;k++)
{
/*If all the pivot elem have been found*/
if(k>=m_iColumns)
{
break;
}

/*Exchange rows downward to find the pivot row*/
for(int i=k+1;i<outputMatrix.m_iRows;i++)
{
/*Pivot is non-zero*/
if(outputMatrix.m_vecMatrix[k][k] != 0)
{
rank++;
break;
}
else
{
if(i < outputMatrix.m_iRows)
{
outputMatrix.exchangeRows(k,i);
}
}
if(k!=i)
{
cout<<"row"<<k+1<<" exchange row"<<i+1<<endl;//Debug
outputMatrix.printfAll();
}
}

/*If there is no pivot in this row*/
if(outputMatrix.m_vecMatrix[k][k] == 0)
{
break;
}

/*Elimination:The rows below pivot row subtract times of pivot row*/
for(int i=k+1;i<outputMatrix.m_iRows;i++)
{
double RowsfirstData = outputMatrix.m_vecMatrix[i][k]/outputMatrix.m_vecMatrix[k][k];//Save the first data of next(k+1) rows
if(RowsfirstData != 0)
{
outputMatrix.m_vecMatrix[i][k]=0;
for(int j=k+1;j<outputMatrix.m_iColumns;j++)
{
outputMatrix.m_vecMatrix[i][j] -= RowsfirstData*outputMatrix.m_vecMatrix[k][j] ;
}
}
cout<<"row"<<i+1<<" - "<<RowsfirstData<<"*"<<"row"<<k+1<<endl;//Debug
outputMatrix.printfAll();
}
}

/*Normalizing:set all rows pivot to 1*/
for(int i=0;i<outputMatrix.m_iRows;i++)
{
for(int j=0;j<outputMatrix.m_iColumns;j++)
{
if(outputMatrix.m_vecMatrix[i][j] !=0 )//pivot has been foound
{
double pivot = outputMatrix.m_vecMatrix[i][j];//get pivot
for(int k=i;k<outputMatrix.m_iColumns;k++)
{
outputMatrix.m_vecMatrix[i][k] /=pivot;
}
cout<<"row"<<i+1<<" / "<<pivot<<endl;//Debug
outputMatrix.printfAll();//Debug
break;
}
}
}

/*Back substitution*/
cout<<"Back substitution:"<<endl;
for(int i = rank;i>=1;i--)
{
/*find a first non-zero elem (It is pivot)*/
for(int j=0;j<outputMatrix.m_iColumns;j++)
{
double times=0;
if(outputMatrix.m_vecMatrix[i][j] !=0)//pivot found
{
for(int l=i-1;l>=0;l--)
{
times = outputMatrix.m_vecMatrix[l][j]/outputMatrix.m_vecMatrix[i][j];
for(int k=j;k<outputMatrix.m_iColumns;k++)//tims of this row subtract by each columns in upon row
{
outputMatrix.m_vecMatrix[l][k] -= times*outputMatrix.m_vecMatrix[i][k];
}
cout<<"row"<<l+1<<" - "<<times<<"*"<<"row"<<i+1<<endl;
outputMatrix.printfAll();
}
break;
}
}
}

*this = outputMatrix;
return true;
}


View Code

使用我们开始的矩阵测试:



Matrix<double> matrix(3,3);
matrix.setSpecifiedElem(0,0,1);
matrix.setSpecifiedElem(0,1,2);
matrix.setSpecifiedElem(0,2,3);
matrix.setSpecifiedElem(1,0,2);
matrix.setSpecifiedElem(1,1,2);
matrix.setSpecifiedElem(1,2,2);
matrix.setSpecifiedElem(2,0,4);
matrix.setSpecifiedElem(2,1,5);
matrix.setSpecifiedElem(2,2,6);
matrix.printfAll();

matrix.rrefmovie();
matrix.printfAll();
system("pause");


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: