大概是燃烧的月亮 2022-12-18 22:21 采纳率: 100%
浏览 49
已结题

c语言矩阵运算器伴随矩阵运算结果错误,请求debug

在写矩阵运算器,伴随矩阵部分按照常规数学思路进行求解,先求余子式(用了新一个数组储存,去掉i行j列后其余数据向内挪填补空缺)代数余子式再转置,但得到的结果有问题,没有找到错误位置。

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double **chushihua(int m,int n){
    double **a=NULL;
    int i,j;
    a=(double **)malloc((m+1)*sizeof(double*));
    for(i=0;i<m;i++){
        a[i]=(double*)malloc((n+1)*sizeof(double));
    }//申请动态内存 
    printf("请输入矩阵数据:\n");
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%lf",&a[i][j]); 
        }
    }
    return a;
} 
void transpose(double **a,int m,int n){
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++){
            printf("%.2lf\t",a[j][i]);
        }
        printf("\n");
    }
}

void dayin(double **matrix,int m,int n){
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++){
            printf("%.2lf\t",matrix[i][j]);
        }
        printf("\n");
    }
}
int main(){
    int m,n,caozuo,i,j;
    double **matrix1=NULL;
    printf("请输入矩阵的行数:");
    scanf("%d",&m); //m为第一个矩阵的行数 
    printf("请输入矩阵的列数:");
    scanf("%d",&n); //n为第一个矩阵的列数 
    matrix1=chushihua(m,n);
    printf("请输入对应的数字编号选择您想要进行的操作:\n1.求转置矩阵;\n2.两个矩阵相加;\n3.求两个矩阵的乘积;\n4.求满足条件的方阵A的伴随矩阵A * 、逆矩阵A -1;\n5.退出\n");
    scanf("%d",&caozuo);
    if(caozuo==1){
        printf("转置后矩阵为:\n");
        transpose(matrix1,m,n);
    }
    else if(caozuo==2){
        double matrix2[m][n]; 
        printf("请输入与其相加的矩阵数据:\n");
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                scanf("%lf",&matrix2[i][j]); 
            }
        }
        printf("相加后矩阵为:\n");
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                printf("%.2lf\t",matrix1[i][j]+matrix2[i][j]);
            }
            printf("\n");
        }
    }
    else if(caozuo==3){
        int col,k;
        double **matrix3=NULL,**matrix4=NULL;
        printf("与之相乘的矩阵的行数与第一个矩阵列数相同。\n");
        printf("请输入与之相乘的矩阵的列数:");
        scanf("%d",&col); 
        matrix3=(double **)malloc((n+1)*sizeof(double*));
        for(i=0;i<n;i++){
            matrix3[i]=(double*)malloc((col+1)*sizeof(double));
        } 
        matrix3=chushihua(n,col);
        double multi[m][col],sum;
        printf("相乘后矩阵为:\n");
        for(i=0;i<m;i++){
            for(j=0;j<col;j++){
                sum=0;
                for(k=0;k<n;k++){
                    sum+=matrix1[i][k]*matrix3[k][j];
                }//循环相加求和计算单个元素 
                multi[i][j]=sum;//存入乘积数组 
                printf("%.2lf\t",multi[i][j]);
            }
            printf("\n");
        }
    }
    else if(caozuo==4){
        int t,k,row;
        double sum1,sum2;
        if(m!=n){
            printf("原矩阵行列数不等,无法求伴随矩阵及逆矩阵,请输入新矩阵的行列数:\n");
            scanf("%d",&row);
            double matrix4[row][row],follow[row][row],yuzishi[row-1][row-1];
            printf("请输入矩阵数据:\n");
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                    scanf("%lf",&matrix4[i][j]); 
                }
            }//原行列数不等的建立新数组储存新矩阵
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                    for(k=0;k<i;k++){
                        for(t=0;t<j;t++){
                            yuzishi[k][t]=matrix4[k][t];
                        }
                    }//i行j列内正常复制 
                    for(k=i;k<row-1;k++){
                        for(t=0;t<j;t++){
                            yuzishi[k][t]=matrix4[k+1][t];
                        }//超过i行的向上移一行 
                    }
                    for(k=0;k<i;k++){
                        for(t=j;t<row-1;t++){
                            yuzishi[k][t]=matrix4[k][t+1];
                        }//超过j列的向左移一列 
                    }
                    for(k=i;k<row-1;k++){
                        for(t=j;t<row-1;t++){
                            yuzishi[k][t]=matrix4[k+1][t+1];
                        }//i行j列外向内移一个  
                    }//求出余子式
                    for(k=0;k<row-1;k++){
                        if(k==0){
                            sum1=yuzishi[0][0];
                            sum2=yuzishi[0][row-1];
                        } 
                        else if(k!=0){
                            sum1*=yuzishi[k][k];//正对角线之积 
                            sum2*=yuzishi[k][row-k-1];//反对角线之积
                        }
                    }
                    if((i+j)%2==0){
                        follow[i][j]=sum1-sum2;
                    }
                    else{
                        follow[i][j]=sum2-sum1;
                    }//求出代数余子式的值 
                }//原矩阵中一个数值的代数余子式求解完毕 
            }
        printf("伴随矩阵为:\n");
        for(i=0;i<row;i++){
            for(j=0;j<row;j++){
            printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵 
            }
        printf("\n");
        }
        }
        else{
            row=m;
            double matrix4[row][row],yuzishi[row-1][row-1],follow[row][row];
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                    matrix4[i][j]=matrix1[i][j];
                }
            }
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                    for(k=0;k<i;k++){
                        for(t=0;t<j;t++){
                            yuzishi[k][t]=matrix4[k][t];
                        }
                    }//i行j列内正常复制 
                    for(k=i;k<row-1;k++){
                        for(t=0;t<j;t++){
                            yuzishi[k][t]=matrix4[k+1][t];
                        }//超过i行的向上移一行 
                    }
                    for(k=0;k<i;k++){
                        for(t=j;t<row-1;t++){
                            yuzishi[k][t]=matrix4[k][t+1];
                        }//超过j列的向左移一列 
                    }
                    for(k=i;k<row-1;k++){
                        for(t=j;t<row-1;t++){
                            yuzishi[k][t]=matrix4[k+1][t+1];
                        }//i行j列外向内移一个  
                    }//求出余子式
                    for(k=0;k<row-1;k++){
                        if(k==0){
                            sum1=yuzishi[0][0];
                            sum2=yuzishi[0][row-1];
                        } 
                        else if(k!=0){
                            sum1*=yuzishi[k][k];//正对角线之积 
                            sum2*=yuzishi[k][row-k-1];//反对角线之积
                        }
                    }
                    if((i+j)%2==0){
                        follow[i][j]=sum1-sum2;
                    }
                    else{
                        follow[i][j]=sum2-sum1;
                    }//求出代数余子式的值 
                }//原矩阵中一个数值的代数余子式求解完毕 
            }
            printf("伴随矩阵为:\n");
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵 
                }
            printf("\n");
            }
        }//相等的继续运算 
    }
    else if(caozuo==5){
        exit(0);
    }
    else{
        printf("错误");
    }
    
}


运行结果及详细报错内容

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

已经检查很多遍了,还是没找到错误的位置

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

希望能帮我找出错误,在原有代码上改正,不要通篇换思路,谢谢

  • 写回答

2条回答 默认 最新

  • 汐^~^ 2022-12-19 11:54
    关注

    你的思路很好,而且完全正确,只是有个小错误,余子式列与行比原矩阵少1,则余子式有row-1行,row-1列,而放在数组中,数组元素是从0开始,所以余子式第一行最后一列表示方法为yuzishi[0][row-2],而不是row-1,row-1代表余子式列数,(row-1)-1才代表数组中的位置,整篇代码,我只改了sum2=yuzishi[0][row-1];与sum2*=yuzishi[k][row-k-1];//反对角线之积,望采纳,修改代码如下:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    double **chushihua(int m,int n){
        double **a=NULL;
        int i,j;
        a=(double **)malloc((m+1)*sizeof(double*));
        for(i=0;i<m;i++){
            a[i]=(double*)malloc((n+1)*sizeof(double));
        }//申请动态内存 
        printf("请输入矩阵数据:\n");
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                scanf("%lf",&a[i][j]); 
            }
        }
        return a;
    } 
    void transpose(double **a,int m,int n){
        int i,j;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++){
                printf("%.2lf\t",a[j][i]);
            }
            printf("\n");
        }
    }
    void dayin(double **matrix,int m,int n){
        int i,j;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++){
                printf("%.2lf\t",matrix[i][j]);
            }
            printf("\n");
        }
    }
    int main(){
        int m,n,caozuo,i,j;
        double **matrix1=NULL;
        printf("请输入矩阵的行数:");
        scanf("%d",&m); //m为第一个矩阵的行数 
        printf("请输入矩阵的列数:");
        scanf("%d",&n); //n为第一个矩阵的列数 
        matrix1=chushihua(m,n);
        printf("请输入对应的数字编号选择您想要进行的操作:\n1.求转置矩阵;\n2.两个矩阵相加;\n3.求两个矩阵的乘积;\n4.求满足条件的方阵A的伴随矩阵A * 、逆矩阵A -1;\n5.退出\n");
        scanf("%d",&caozuo);
        if(caozuo==1){
            printf("转置后矩阵为:\n");
            transpose(matrix1,m,n);
        }
        else if(caozuo==2){
            double matrix2[m][n]; 
            printf("请输入与其相加的矩阵数据:\n");
            for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                    scanf("%lf",&matrix2[i][j]); 
                }
            }
            printf("相加后矩阵为:\n");
            for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                    printf("%.2lf\t",matrix1[i][j]+matrix2[i][j]);
                }
                printf("\n");
            }
        }
        else if(caozuo==3){
            int col,k;
            double **matrix3=NULL,**matrix4=NULL;
            printf("与之相乘的矩阵的行数与第一个矩阵列数相同。\n");
            printf("请输入与之相乘的矩阵的列数:");
            scanf("%d",&col); 
            matrix3=(double **)malloc((n+1)*sizeof(double*));
            for(i=0;i<n;i++){
                matrix3[i]=(double*)malloc((col+1)*sizeof(double));
            } 
            matrix3=chushihua(n,col);
            double multi[m][col],sum;
            printf("相乘后矩阵为:\n");
            for(i=0;i<m;i++){
                for(j=0;j<col;j++){
                    sum=0;
                    for(k=0;k<n;k++){
                        sum+=matrix1[i][k]*matrix3[k][j];
                    }//循环相加求和计算单个元素 
                    multi[i][j]=sum;//存入乘积数组 
                    printf("%.2lf\t",multi[i][j]);
                }
                printf("\n");
            }
        }
        else if(caozuo==4){
            int t,k,row;
            double sum1,sum2;
            if(m!=n){
                printf("原矩阵行列数不等,无法求伴随矩阵及逆矩阵,请输入新矩阵的行列数:\n");
                scanf("%d",&row);
                double matrix4[row][row],follow[row][row],yuzishi[row-1][row-1];
                printf("请输入矩阵数据:\n");
                for(i=0;i<row;i++){
                    for(j=0;j<row;j++){
                        scanf("%lf",&matrix4[i][j]); 
                    }
                }//原行列数不等的建立新数组储存新矩阵
                for(i=0;i<row;i++){
                    for(j=0;j<row;j++){
                        for(k=0;k<i;k++){
                            for(t=0;t<j;t++){
                                yuzishi[k][t]=matrix4[k][t];
                            }
                        }//i行j列内正常复制 
                        for(k=i;k<row-1;k++){
                            for(t=0;t<j;t++){
                                yuzishi[k][t]=matrix4[k+1][t];
                            }//超过i行的向上移一行 
                        }
                        for(k=0;k<i;k++){
                            for(t=j;t<row-1;t++){
                                yuzishi[k][t]=matrix4[k][t+1];
                            }//超过j列的向左移一列 
                        }
                        for(k=i;k<row-1;k++){
                            for(t=j;t<row-1;t++){
                                yuzishi[k][t]=matrix4[k+1][t+1];
                            }//i行j列外向内移一个  
                        }//求出余子式
                        for(k=0;k<row-1;k++){
                            if(k==0){
                                sum1=yuzishi[0][0];
                                sum2=yuzishi[0][row-2];
                            } 
                            else if(k!=0){
                                sum1*=yuzishi[k][k];//正对角线之积 
                                sum2*=yuzishi[k][row-k-2];//反对角线之积
                            }
                        }
                        if((i+j)%2==0){
                            follow[i][j]=sum1-sum2;
                        }
                        else{
                            follow[i][j]=sum2-sum1;
                        }//求出代数余子式的值 
                    }//原矩阵中一个数值的代数余子式求解完毕 
                }
            printf("伴随矩阵为:\n");
            for(i=0;i<row;i++){
                for(j=0;j<row;j++){
                printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵 
                }
            printf("\n");
            }
            }
            else{
                row=m;
                double matrix4[row][row],yuzishi[row-1][row-1],follow[row][row];
                for(i=0;i<row;i++){
                    for(j=0;j<row;j++){
                        matrix4[i][j]=matrix1[i][j];
                    }
                }
                for(i=0;i<row;i++){
                    for(j=0;j<row;j++){
                        for(k=0;k<i;k++){
                            for(t=0;t<j;t++){
                                yuzishi[k][t]=matrix4[k][t];
                            }
                        }//i行j列内正常复制 
                        for(k=i;k<row-1;k++){
                            for(t=0;t<j;t++){
                                yuzishi[k][t]=matrix4[k+1][t];
                            }//超过i行的向上移一行 
                        }
                        for(k=0;k<i;k++){
                            for(t=j;t<row-1;t++){
                                yuzishi[k][t]=matrix4[k][t+1];
                            }//超过j列的向左移一列 
                        }
                        for(k=i;k<row-1;k++){
                            for(t=j;t<row-1;t++){
                                yuzishi[k][t]=matrix4[k+1][t+1];
                            }//i行j列外向内移一个  
                        }//求出余子式
                        for(k=0;k<row-1;k++){
                            if(k==0){
                                sum1=yuzishi[0][0];
                                sum2=yuzishi[0][row-2];
                            } 
                            else if(k!=0){
                                sum1*=yuzishi[k][k];//正对角线之积 
                                sum2*=yuzishi[k][row-k-2];//反对角线之积
                            }
                        }
                        if((i+j)%2==0){
                            follow[i][j]=sum1-sum2;
                        }
                        else{
                            follow[i][j]=sum2-sum1;
                        }//求出代数余子式的值 
                    }//原矩阵中一个数值的代数余子式求解完毕 
                }
                printf("伴随矩阵为:\n");
                for(i=0;i<row;i++){
                    for(j=0;j<row;j++){
                    printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵 
                    }
                printf("\n");
                }
            }//相等的继续运算 
        }
        else if(caozuo==5){
            exit(0);
        }
        else{
            printf("错误");
        }
    }
    

    正确计算运行截图如下:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 赞助了问题酬金15元 12月19日
  • 创建了问题 12月18日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加