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

白昼怎懂夜的黑 提交于 2020-01-20 00:32:31

很久没有写过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("请输入矩阵:\n");
    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("运算结果:\n");
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%f ",array[i][j]);
        }
        printf("\n");
    }
}
void test()
{
    printf("请输入你想进行的运算:\n1.求行列式值\n2.求逆矩阵\n3.矩阵加减运算\n4.矩阵数乘运算\n");
    int choise=0;
    cin>>choise;
    if(choise==1)
    {
           printf("请输入你想输入矩阵的阶数:");
            int n;
          cin>>n;
          float **array=Creat(n);
         float Result=Value(array,n); 
         printf("行列式的值=%f\n",Result);
    }
    else if(choise==2)
    {
           printf("请输入你想输入矩阵的阶数:");
            int n;
          cin>>n;
          float **array=Creat(n);
         float Result=Value(array,n); 
           if(Result==0) 
           {
            printf("该矩阵没有逆矩阵\n");
           }
        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("请输入矩阵:\n");    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("运算结果:\n");    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            printf("%f ",array[i][j]);        }        printf("\n");    }}void test(){printf("请输入你想进行的运算:\n1.求行列式值\n2.求逆矩阵\n3.矩阵加减运算\n4.矩阵数乘运算\n");int choise=0;cin>>choise;if(choise==1){   printf("请输入你想输入矩阵的阶数:");int n;  cin>>n;  float **array=Creat(n); float Result=Value(array,n);  printf("行列式的值=%f\n",Result);}else if(choise==2){   printf("请输入你想输入矩阵的阶数:");int n;  cin>>n;  float **array=Creat(n); float Result=Value(array,n);    if(Result==0)    {printf("该矩阵没有逆矩阵\n");   }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();}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!