线性代数运算

来源:互联网 发布:阿里云到底是干嘛的 编辑:程序博客网 时间:2024/06/06 23:17
#include<iostream>#include<cstdlib>using namespace std;class matrix{private:    int fun1(int **a,int n)    {        int t=0;        if(n==1)            return a[0][0];        if(n==2)            return a[0][0]*a[1][1]-a[1][0]*a[0][1];        for(int y=0; y<n; y++)            t+=fun2(a,n,0,y,1);        return t;    }    int fun2(int **a,int n,int x,int y,int r)    {        int t=0;        int **b=new int *[n-1];        for(int i=0; i<n-1; i++)        {            b[i]=new int[n-1];            for(int j=0; j<n-1; j++)            {                if(i<x&&j<y)                    b[i][j]=a[i][j];                else if(i<x&&j>=y)                    b[i][j]=a[i][j+1];                else if(i>=x&&j<y)                    b[i][j]=a[i+1][j];                else if(i>=x&&j>=y)                    b[i][j]=a[i+1][j+1];            }        }        int s=1;        if((x+y)%2)            s=-1;        if(r==0)            t+=s*fun1(b,n-1);        else t+=s*a[x][y]*fun1(b,n-1);        delete[] b;        return t;    }    void fun3(int **a,int m,int n,double **b)    {        for(int i=0; i<n; i++)            for(int j=0; j<m; j++)                b[i][j]=a[j][i];    }public:    void determinant_calculation()//行列式计算    {        int n;cin>>n;        int **a=new int *[n];        for(int i=0; i<n; i++)        {            a[i]=new int[n];            for(int j=0; j<n; j++)                cin>>a[i][j];        }        cout<<fun1(a,n)<<endl;        delete[] a;    }    void mul()//矩阵乘法    {        int m1,n1,m2,n2;        cin>>m1>>n1;        int a[m1][n1]= {0};        for(int i=0; i<m1; i++)            for(int j=0; j<n1; j++)                cin>>a[i][j];        cin>>m2>>n2;        int b[m2][n2]= {0};        for(int i=0; i<m2; i++)            for(int j=0; j<n2; j++)                cin>>b[i][j];        int c[m1][n2]= {0};        for(int i=0; i<m1; i++)        {            for(int j=0; j<n2; j++)            {                for(int k=0; k<n1; k++)                    c[i][j]+=a[i][k]*b[k][j];                cout<<c[i][j]<<" ";            }            cout<<endl;        }    }    void transpose()//转置    {        int m,n;cin>>m>>n;        int **a=new int *[m];        for(int i=0; i<m; i++)        {            a[i]=new int[n];            for(int j=0; j<n; j++)                cin>>a[i][j];        }        double **b=new double *[n];        for(int i=0; i<n; i++)            b[i]=new double[m];        fun3(a,m,n,b);        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)                cout<<b[i][j]<<" ";            cout<<endl;        }    }    void accompany()//伴随    {        int m;cin>>m;        int **a=new int *[m];        for(int i=0; i<m; i++)        {            a[i]=new int[m];            for(int j=0; j<m; j++)                cin>>a[i][j];        }        int **b=new int *[m];        for(int i=0; i<m; i++)            b[i]=new int[m];        for(int i=0; i<m; i++)            for(int j=0; j<m; j++)                b[i][j]=fun2(a,m,i,j,0);        double **c=new double *[m];        for(int i=0; i<m; i++)            c[i]=new double[m];        fun3(b,m,m,c);        for(int i=0; i<m; i++)        {            for(int j=0; j<m; j++)                cout<<c[i][j]<<" ";            cout<<endl;        }        delete[] a;    }    void inverse()//逆矩阵    {        int m;cin>>m;        int **a=new int *[m];        for(int i=0; i<m; i++)        {            a[i]=new int[m];            for(int j=0; j<m; j++)                cin>>a[i][j];        }        if(fun1(a,m))        {            int **b=new int *[m];            for(int i=0; i<m; i++)                b[i]=new int[m];            for(int i=0; i<m; i++)                for(int j=0; j<m; j++)                    b[i][j]=fun2(a,m,i,j,0);            double **c=new double *[m];            for(int i=0; i<m; i++)                c[i]=new double[m];            fun3(b,m,m,c);            double q=1.0/fun1(a,m);            for(int i=0; i<m; i++)            {                for(int j=0; j<m; j++)                    cout<<q*c[i][j]<<" ";                cout<<endl;            }            delete[] b;            delete[] c;        }        else cout<<"行列式为0,逆矩阵不存在"<<endl;        delete[] a;    }}matrix;int main(){    int t;    while(cin>>t)    {        if(t==1)matrix.determinant_calculation();        else if(t==2)matrix.mul();        else if(t==3)matrix.transpose();        else if(t==4)matrix.accompany();        else if(t==5)matrix.inverse();    }    return 0;}
1 0