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

高斯-约当(Gauss-Jordan)消元法——c++代码实现

2017-04-09 23:23 375 查看
具体算法的详细原理请参照此篇博客:高斯-约当(Gauss-Jordan)消元法

下面是具体c++代码,不保证程序最优化,提供一个可行的程序,供大家改进,同时感谢大家提意见。——大神勿喷呀,我是一个小菜鸟~

void Guss_Jordan(int n,double *a)//阶数n 系数矩阵a
{
double*a_temp = new double[n*n * 2];//a与单位矩阵的组合
double *temp = new double[n*n];//单位矩阵
for (int i = 0; i < n; i++)//生成对应的单位矩阵
{
for (int j = 0; j < n; j++)
{
if (i==j)
{
*(temp + i*n + j) = 1;
}
else
{
*(temp + i*n + j) = 0;
}
}
}
for (int i = 0; i < n; i++)//把a与单位矩阵组合
{
for (int j = 0; j < 2*n; j++)
{
if (j>n-1)
{
*(a_temp+i*n*2+j) = *(temp + i*n + j - n);
}
else
{
*(a_temp + i*n * 2 + j) = *(a+i *n + j);
}
}
}
delete[]temp;//释放临时空间
for (int i = 0; i < n; i++)
{
double m = *(a_temp + i*n * 2 + i);//把对角线元素当做分母
if (m==0)//对角线元素不能为0
{
cout << "程序失败,对角线元素为0"; return;
}
for (int j = 0; j < 2*n; j++)
{
*(a_temp + i*n * 2 + j) = *(a_temp + i*n * 2 + j) / m;//对角线元素化为1
}
for (int k = i+1; k < n; k++)
{
double Multiples = *(a_temp + k * 2 * n + 0);//每行减去的倍数
for (int j = 0; j < 2 * n; j++)//化简每行
{
*(a_temp + k * 2 * n + j) = *(a_temp + k * 2 * n + j) - Multiples*(*(a_temp + (k - 1) * 2 * n + j));//由对角线元素化简本列
}
}
for (int k = i; k >0; k--)
{
double Multiples =*(a_temp+(k-1)*n*2+k) /(*(a_temp + k * 2 * n + k));//每行减去的倍数
for (int j = 0; j < 2 * n; j++)//化简前对应列面行
{
*(a_temp + (k-1) * 2 * n + j) = *(a_temp + (k-1) * 2 * n + j) - Multiples*(*(a_temp + k * 2 * n + j));//由行首元素化简本列其他元素
}
}
}

cout << "逆矩阵为:\n";
for (int i = 0; i < n; i++)//输出逆矩阵
{
for (int j = 0; j < 2 * n; j++)
{
if (j>n - 1)//只输出逆矩阵
{
cout << a_temp[i * 2 * n + j]<<'\t';
}

}
cout << endl;
}
delete[]a_temp;

}


自己编写的代码,所以不是很规范,希望大家多提意见,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 矩阵