Cpp-行列式计算

  今天尝试用cpp做c的题的时候,发现有一个求三阶矩阵的题目,线代课上的大作业历历在目,于是我就想要不尝试一下用cpp实现一下相同的功能,于是今天下午一边打剿灭,一边打完了这段代码

  基本思路:先将矩阵化为上三角矩阵,然后将所有上三角矩阵对角线的数字相乘得到行列式的值。利用高斯消元法进行矩阵变化时要考虑到0的情况。

  为了方便调试代码,我们先编一个打印矩阵的函数

/*矩阵打印*/
void printsq(double *arr,int len){
    for(int i=0;i<len;i++){
        for(int j=0;j<len;j++){
            cout<<*(arr+i*len+j)<<"\t";
        }
        cout<<"\n";
    }
} 
矩阵打印

  然后再编一个换行的函数

/*将两个地址的数值交换*/ 
void exchange(double *arr1,double *arr2)
{    double temp=*arr1; 
    *arr1=*arr2;
    *arr2=temp;
}
/*将两行交换*/ 
void exchangerow(double *arr,int y1,int y2,int len){
    int start1=y1*len;
    int start2=y2*len;
    for(int i = 0;i<len;i++){
        exchange(arr+start1+i,arr+start2+i);
    }
}
换行

  然后再把一般情况下的高斯消元法函数写出来

/*高斯消元法*/ 
void gaosi(double *arr,int y1,int y2,int len){
    if(y1>=y2)
        {
        return;
    }
    int start1=y1*(len+1),start2=y2*len+y1;
    double time=(*(arr+start2))/(*(arr+start1));
    for(int i=0;i<len-y1;i++)
        {
        *(arr+start2+i)-=time*(*(arr+start1+i));
    }
}
高斯消元法

  遇到0则换行,没遇到0则利用高斯消元法消元,注意判别一列都是0的情况

/*变化为上三角矩阵*/ 
void uptan(double *arr,int len){
    for(int y1=0;y1<len-1;y1++)
    {
        
        
        
        int start1=(y1-1)*(len+1),y2;
        if(fabs(*(arr+start1))<0.001)
        {
            for(y2=len-1;y2>y1;y2--)
            {
                int start2=(y2-1)*(len+1);
                if(fabs(*(arr+start2))<0.01){
                    exchangerow(arr,y1,y2,len);
                    break;
                }
            }
            
        }
        /*一列都是0则直接开始下一列消元*/
        if(y2==y1+1){
            continue;
        }
        for(int y2=len-1;y2>y1;y2--)
        {
            gaosi(arr,y1,y2,len);
        }
    }
}
上三角矩阵

  终于解决了上三角矩阵,剩下的就很简单了,只需要把上三角矩阵主对角线元素全部相乘就可以得到行列式的值了

  
/*求对角线元素乘积*/
double duijiaoxianchengji(double* arr,int len){
    double res = 1;
    for(int i=0;i<len;i++){
        res*=*(arr+(len+1)*i);
    }
    return res;
} 
求行列式

  最后让我们试验一下效果吧

int main()
{
    double a[5][5]=
    {
    1,9,5,2,8,
    1,3,4,5,2,
    1,2,12,2,7,
    0.5,0.2,0.3,0.7,0.9,
    0.01,0.02,0.03,0.4,0.04
    };
    uptan(&a[0][0],5);
    printsq(&a[0][0],5);
    cout<<"res="<<duijiaoxianchengji(&a[0][0],5);
}
实战

  这个结果对不对呢,这里请出一个宝藏网站——云算网

大家可以将矩阵内容直接复制到网站里进行验证

 

posted on 2020-03-24 13:19  crazyplayer  阅读(401)  评论(0编辑  收藏  举报

导航