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

具体算法的详细原理请参照此篇博客:高斯-约当(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;

}

自己编写的代码,所以不是很规范,希望大家多提意见,谢谢!

你可能感兴趣的:(学习之路)