关于矩阵求逆的小想法(疑问)……
查看原帖
关于矩阵求逆的小想法(疑问)……
769863
_Lyk_def楼主2023/7/3 20:14

矩阵求逆的核心代码貌似就是高斯消元

高斯消元的核心代码

for(int i=1;i<=n;i++){
        p=i;
        for(int j=i;j<=n;j++) if(a[j][i]>a[p][i]) p=j;
        if(!a[p][i]){cout<<"No Solution"<<endl; return 0;}
        for(int k=1;k<=n+1;k++) swap(a[i][k],a[p][k]);
        double b=a[i][i];
        //此处系数化1
        for(int k=1;k<=n+1;k++) a[i][k]/=b;
        //此次处理其他式子
        for(int j=1;j<=n;j++) if(j!=i){
            double c=a[j][i];
            for(int k=1;k<=n+1;k++) 
                a[j][k]-=c*a[i][k];
        }
    }

矩阵求逆的核心代码

for(int i=1;i<=n;i++){
        int pl=i;
        for(int j=i+1;j<=n;++j)
            if(a[j][i]>a[pl][i]) pl=j;
        swap(a[i],a[pl]);
        if(!a[i][i]){ cout<<"No Solution"<<endl; return 0; }
        ll kk=f_pow(a[i][i],mod-2);
        for(int j=1;j<=n;j++) if(i!=j) {
            int p=a[j][i]*kk%mod;
            //此处处理其他行
            for(int k=1;k<=2*n;k++)
                //此处不同
                a[j][k]=(a[j][k]-p*a[i][k]%mod+mod)%mod;
        }
        //此处系数化1
        for(int k=1;k<=2*n;k++) a[i][k]=a[i][k]*kk%mod;
    }

为什么系数化1放到了后面呢

这样写

for(int i=1;i<=n;i++){
        int pl=i;
        for(int j=i+1;j<=n;++j)
            if(a[j][i]>a[pl][i]) pl=j;
        swap(a[i],a[pl]);
        if(!a[i][i]){ cout<<"No Solution"<<endl; return 0; }
        ll kk=f_pow(a[i][i],mod-2);
        //此处系数化1
        for(int k=1;k<=2*n;k++) a[i][k]=a[i][k]*kk%mod;
        for(int j=1;j<=n;j++) if(i!=j) {
            int p=a[j][i]%mod;
            //此处处理其他行
            for(int k=1;k<=2*n;k++)
                //此处不同
                a[j][k]=(a[j][k]-p*a[i][k]%mod+mod)%mod;
        }
    }

这样写为什么是错的呢

求大佬解答喵

2023/7/3 20:14
加载中...