• 矩阵的逆矩阵和行列式值的递归算法。


    很久没有写过C语言,今天写了一个关于矩阵的算法

    完整代码如下:

    #include<atlstr.h>
    #include<iostream>
    #include<string>
    using namespace std;
    //创建矩阵
    float **Creat(int n)
    {
        float **array=new float*[n];
        for(int i=0;i<n;i++)
        {
            array[i]=new float[n];
        }
        printf("请输入矩阵:
    ");
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>array[i][j];
            }
        }
        return array;
    }
    //求行列式的值:
    float Value(float **array,int n)
    {
        float Result=0;
        if(n==1) return array[0][0];
        float **temp=new float*[n-1];
        for(int i=0;i<n-1;i++)
        {
            temp[i]=new float[n-1];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n-1;j++)
            {
                for(int k=0;k<n-1;k++)
                {
                    int flag;
                    if(j<i)  flag=0;
                    else flag=1;
                    temp[j][k]=array[j+flag][k+1];
                }
            }
            int flag2=-1;
            if(i%2==0) flag2=1;
            Result+=flag2*array[i][0]*Value(temp,n-1);
        }
        return Result;
    }
    //求逆矩阵: 伴随矩阵行列式的值除以行列式的值
    float **GetMarin(float **array,int n)
    {
        float **resultMarin=array;
        float resultSum=Value(array,n);
        float **temp=new float*[n-1];
        for(int i=0;i<n-1;i++)
        {
            temp[i]=new float[n-1];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                for(int k=0;k<n-1;k++)
                {
                    for(int m=0;m<n-1;m++)
                    {
                        int flag1=0;
                        int flag2=0;
                        if(k<i) flag1=0;
                        else flag1=1;
                        if(m<j) flag2=0;
                        else flag2=1;
                        temp[k][m]=array[k+flag1][m+flag2];
                    }
                }
                int flag3=-1;
                if((i+j)%2==0) flag3=1;
                resultMarin[j][i]=(float)flag3*Value(temp,n-1)/resultSum;
            }
        }
        return resultMarin;
    }
    //矩阵加减
    float **GetAdd(float **array1,float **array2,int rowCount,int columCount,float v)
    {
        float **result=new float*[rowCount];
        for(int i=0;i<rowCount;i++)
        {
            result[i]=new float[columCount];
        }
        for(int i=0;i<rowCount;i++)
        {
            for(int j=0;j<columCount;j++)
            {
                 result[i][j]=array1[i][j]+v*array2[i][j];
            }
        }
        return result;
    }
    //倍法矩阵
    float **Matrixk(float **arry,int rowCount,int columCount,int k)
    {
        float **result=new float*[rowCount];
        for(int i=0;i<rowCount;i++)
        {
            result[i]=new float[columCount];
        }
        for(int i=0;i<rowCount;i++)
        {
            for(int j=0;j<columCount;j++)
            {
                 result[i][j]=k*(arry[i][j]);
            }
        }
        return result;
    }
    //矩阵数乘
    float **MatrixCheng(float **arry1,float **arry2,int rowCount1,int columCount1,int rowCount2,int columCount2)
    {
        if(columCount1!=rowCount2)
        {
            return NULL;
        }
        float **result=new float*[rowCount1];
        for(int i=0;i<rowCount1;i++)
        {
            result[i]=new float[columCount2];
        }
        //数乘运算
        for(int i=0;i<rowCount1;i++)
        {
            for(int j=0;j<columCount2;j++)
            {
                float temp=0;
                for(int k=0;k<columCount1;k++)
                {
                    temp+=arry1[i][k]*arry2[k][j];
                }
                result[i][j]=temp;
            }
        }
        return result;
    }
    /***********下面进行测试,为了方便,全部采用的方阵**********/
    void OutPut(float **array,int n)
    {
        printf("运算结果:
    ");
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%f ",array[i][j]);
            }
            printf("
    ");
        }
    }
    void test()
    {
        printf("请输入你想进行的运算:
    1.求行列式值
    2.求逆矩阵
    3.矩阵加减运算
    4.矩阵数乘运算
    ");
        int choise=0;
        cin>>choise;
        if(choise==1)
        {
               printf("请输入你想输入矩阵的阶数:");
                int n;
              cin>>n;
              float **array=Creat(n);
             float Result=Value(array,n); 
             printf("行列式的值=%f
    ",Result);
        }
        else if(choise==2)
        {
               printf("请输入你想输入矩阵的阶数:");
                int n;
              cin>>n;
              float **array=Creat(n);
             float Result=Value(array,n); 
               if(Result==0) 
               {
                printf("该矩阵没有逆矩阵
    ");
               }
            else
            {
              float **resultMarin=GetMarin(array,n);
              OutPut(resultMarin,n);
            }
        }
        else if(choise==3)
        {
              printf("请输入你想输入矩阵1的阶数:");
                int n1;
              cin>>n1;
              float **array1=Creat(n1);
             printf("请输入你想输入矩阵2的阶数:");
                int n2;
              cin>>n2;
              float **array2=Creat(n2);
              printf("请输入运算系数:");
              float opreation=0;
              cin>>opreation;
              float **resultMarin=GetAdd(array1,array2,n1,n1,opreation);
                OutPut(resultMarin,n1);
        }
        else if(choise==4)
        {
               printf("请输入你想输入矩阵1的阶数:");
                int n1;
              cin>>n1;
              float **array1=Creat(n1);
             printf("请输入你想输入矩阵2的阶数:");
                int n2;
              cin>>n2;
              float **array2=Creat(n2);
              float **resultMarin=MatrixCheng(array1,array2,n1,n1,n2,n2);
                OutPut(resultMarin,n1);
        }
        else
        {
            printf("------------");
        }
        test();
    }
    void main()
    {
        test();
    }

    #include<atlstr.h>#include<iostream>#include<string>using namespace std;//创建矩阵float **Creat(int n){    float **array=new float*[n];    for(int i=0;i<n;i++)    {        array[i]=new float[n];    }    printf("请输入矩阵: ");    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            cin>>array[i][j];        }    }    return array;}//求行列式的值:float Value(float **array,int n){    float Result=0;    if(n==1) return array[0][0];    float **temp=new float*[n-1];    for(int i=0;i<n-1;i++)    {        temp[i]=new float[n-1];    }    for(int i=0;i<n;i++)    {        for(int j=0;j<n-1;j++)        {            for(int k=0;k<n-1;k++)            {                int flag;                if(j<i)  flag=0;                else flag=1;                temp[j][k]=array[j+flag][k+1];            }        }        int flag2=-1;        if(i%2==0) flag2=1;        Result+=flag2*array[i][0]*Value(temp,n-1);    }    return Result;}//求逆矩阵: 伴随矩阵行列式的值除以行列式的值float **GetMarin(float **array,int n){    float **resultMarin=array;    float resultSum=Value(array,n);    float **temp=new float*[n-1];    for(int i=0;i<n-1;i++)    {        temp[i]=new float[n-1];    }    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            for(int k=0;k<n-1;k++)            {                for(int m=0;m<n-1;m++)                {                    int flag1=0;                    int flag2=0;                    if(k<i) flag1=0;                    else flag1=1;                    if(m<j) flag2=0;                    else flag2=1;                    temp[k][m]=array[k+flag1][m+flag2];                }            }            int flag3=-1;            if((i+j)%2==0) flag3=1;            resultMarin[j][i]=(float)flag3*Value(temp,n-1)/resultSum;        }    }    return resultMarin;}//矩阵加减float **GetAdd(float **array1,float **array2,int rowCount,int columCount,float v){float **result=new float*[rowCount];for(int i=0;i<rowCount;i++){result[i]=new float[columCount];}for(int i=0;i<rowCount;i++){for(int j=0;j<columCount;j++){ result[i][j]=array1[i][j]+v*array2[i][j];}}return result;}//倍法矩阵float **Matrixk(float **arry,int rowCount,int columCount,int k){float **result=new float*[rowCount];for(int i=0;i<rowCount;i++){result[i]=new float[columCount];}for(int i=0;i<rowCount;i++){for(int j=0;j<columCount;j++){ result[i][j]=k*(arry[i][j]);}}return result;}//矩阵数乘float **MatrixCheng(float **arry1,float **arry2,int rowCount1,int columCount1,int rowCount2,int columCount2){if(columCount1!=rowCount2){return NULL;}float **result=new float*[rowCount1];for(int i=0;i<rowCount1;i++){result[i]=new float[columCount2];}//数乘运算for(int i=0;i<rowCount1;i++){for(int j=0;j<columCount2;j++){float temp=0;for(int k=0;k<columCount1;k++){temp+=arry1[i][k]*arry2[k][j];}result[i][j]=temp;}}return result;}/***********下面进行测试,为了方便,全部采用的方阵**********/void OutPut(float **array,int n){    printf("运算结果: ");    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            printf("%f ",array[i][j]);        }        printf(" ");    }}void test(){printf("请输入你想进行的运算: 1.求行列式值 2.求逆矩阵 3.矩阵加减运算 4.矩阵数乘运算 ");int choise=0;cin>>choise;if(choise==1){   printf("请输入你想输入矩阵的阶数:");int n;  cin>>n;  float **array=Creat(n); float Result=Value(array,n);  printf("行列式的值=%f ",Result);}else if(choise==2){   printf("请输入你想输入矩阵的阶数:");int n;  cin>>n;  float **array=Creat(n); float Result=Value(array,n);    if(Result==0)    {printf("该矩阵没有逆矩阵 ");   }else{  float **resultMarin=GetMarin(array,n);  OutPut(resultMarin,n);}}else if(choise==3){  printf("请输入你想输入矩阵1的阶数:");int n1;  cin>>n1;  float **array1=Creat(n1);     printf("请输入你想输入矩阵2的阶数:");int n2;  cin>>n2;  float **array2=Creat(n2);  printf("请输入运算系数:");  float opreation=0;  cin>>opreation;  float **resultMarin=GetAdd(array1,array2,n1,n1,opreation);    OutPut(resultMarin,n1);}else if(choise==4){   printf("请输入你想输入矩阵1的阶数:");int n1;  cin>>n1;  float **array1=Creat(n1);     printf("请输入你想输入矩阵2的阶数:");int n2;  cin>>n2;  float **array2=Creat(n2);  float **resultMarin=MatrixCheng(array1,array2,n1,n1,n2,n2);    OutPut(resultMarin,n1);}else{printf("------------");}    test();}void main(){    test();}

  • 相关阅读:
    Slim + Twig 构建PHP Web应用程序
    Slim
    nginx+php+flight 构建RESTFul API
    Redis Master/Slave 实践
    spring.net +dapper 打造简易的DataAccess 工具类.
    API文档管理工具-数据库表结构思考.
    解决oracle报 ORA-12560错误,只有服务器重启恢复正常的问题
    浮点数的编码
    Jquery.BlockUI-遮罩
    class.forname & classloader
  • 原文地址:https://www.cnblogs.com/Huaran1chendu/p/4841607.html
Copyright © 2020-2023  润新知