鱼C论坛

 找回密码
 立即注册
查看: 1683|回复: 8

[已解决]小白求助 如何计算矩阵行列式的值?

[复制链接]
发表于 2020-10-14 10:45:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问计算矩阵行列式的值的程序该怎么写?
最佳答案
2020-10-14 17:24:48
#include <stdio.h>
#include <math.h>
 
#define MAX 100
 
double D(double arr[][MAX], int n);
void Display(double arr[][MAX], int n);
 
void main()
{
    double arr[MAX][MAX];
    double bak[MAX][MAX];
    double value;
    int n;
    int i,j,k,c;
 
    printf("Please enter matrix size n(1 <= n < 20):");
    scanf("%d",&n);
 
    printf("Please input matrix line by line:\n");
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            scanf("%lf",&arr[i][j]);
        }
    }
 
    printf("matrix a:\n");
    Display(arr,n);
 
    /* 保存D(0,i)的值到bak中 */
    for(i = 0;i < n;i++)               /* 处理第1行的每一列元素 */
    {
        for(j = 1;j < n;j++)           /* 逐行处理 */
        {
            for(c = 0,k = 0;k < n;k++) /* 逐列处理 */
           {
                if(k == i)
                {
                    continue;
                }
                bak[j - 1][c++] = arr[j][k];
            }
        }
        value = D(bak,n-1);
 
        printf("Submatrix:\n");
        Display(bak,n-1);
 
        printf("DValue of the Submatrix is %f\n",D(bak,n - 1));
    }
 
    value = D(arr,n);
    printf("result = %f\n",value);
}
 
double D(double arr[][MAX],int n)
{
    double bak[MAX][MAX];
    int i,j,k,c;
    double sum = 0;
 
    if(n == 1)
    {
        return arr[0][0];
    }
 
    for(i = 0;i < n;i++)                /* 处理第1行的每一列元素 */
    {
        for(j = 1;j < n;j++)            /* 逐行处理 */
        {
            for(c = 0,k = 0;k < n;k++)  /* 逐列处理 */
            {
                if(k == i)
                {
                    continue;
                }
                bak[j - 1][c++] = arr[j][k];
            }
        }
 
        /* 计算arr(row,col) * D(row,col)的值 */
        sum += (i % 2 == 0 ? 1 : -1) * arr[0][i] * D(bak,n - 1);
    }
    return sum;
}
 
void Display(double arr[][MAX],int n)
{
    int i,j;
    printf("");
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            printf("%10.1lf",arr[i][j]);
        }
        printf("\n");
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-14 11:08:26 | 显示全部楼层

你到底是求行列式的值 还是求增广矩阵对应的线性方程组的解

行列式的值np.linalg.det
增广矩阵求解np.linalg.solve
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-14 17:24:48 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <math.h>
 
#define MAX 100
 
double D(double arr[][MAX], int n);
void Display(double arr[][MAX], int n);
 
void main()
{
    double arr[MAX][MAX];
    double bak[MAX][MAX];
    double value;
    int n;
    int i,j,k,c;
 
    printf("Please enter matrix size n(1 <= n < 20):");
    scanf("%d",&n);
 
    printf("Please input matrix line by line:\n");
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            scanf("%lf",&arr[i][j]);
        }
    }
 
    printf("matrix a:\n");
    Display(arr,n);
 
    /* 保存D(0,i)的值到bak中 */
    for(i = 0;i < n;i++)               /* 处理第1行的每一列元素 */
    {
        for(j = 1;j < n;j++)           /* 逐行处理 */
        {
            for(c = 0,k = 0;k < n;k++) /* 逐列处理 */
           {
                if(k == i)
                {
                    continue;
                }
                bak[j - 1][c++] = arr[j][k];
            }
        }
        value = D(bak,n-1);
 
        printf("Submatrix:\n");
        Display(bak,n-1);
 
        printf("DValue of the Submatrix is %f\n",D(bak,n - 1));
    }
 
    value = D(arr,n);
    printf("result = %f\n",value);
}
 
double D(double arr[][MAX],int n)
{
    double bak[MAX][MAX];
    int i,j,k,c;
    double sum = 0;
 
    if(n == 1)
    {
        return arr[0][0];
    }
 
    for(i = 0;i < n;i++)                /* 处理第1行的每一列元素 */
    {
        for(j = 1;j < n;j++)            /* 逐行处理 */
        {
            for(c = 0,k = 0;k < n;k++)  /* 逐列处理 */
            {
                if(k == i)
                {
                    continue;
                }
                bak[j - 1][c++] = arr[j][k];
            }
        }
 
        /* 计算arr(row,col) * D(row,col)的值 */
        sum += (i % 2 == 0 ? 1 : -1) * arr[0][i] * D(bak,n - 1);
    }
    return sum;
}
 
void Display(double arr[][MAX],int n)
{
    int i,j;
    printf("");
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < n;j++)
        {
            printf("%10.1lf",arr[i][j]);
        }
        printf("\n");
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-14 21:52:35 | 显示全部楼层
帮你顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 09:33:19 | 显示全部楼层
如果满意了,回来选个最佳答案哈~~你这个举手之劳的动作不需要你付出任何(鱼币、荣誉值、积分),由系统给我们进行奖励:鱼币+3,荣誉+2,技术+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 01:03:30 | 显示全部楼层
还没满意?帮你顶上去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 14:40:32 | 显示全部楼层
还有什么不满意的,你倒是说话呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 19:48:06 | 显示全部楼层
风过无痕1989 发表于 2020-10-17 14:40
还有什么不满意的,你倒是说话呀

不好意思我才看到,我明白了谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 19:49:43 | 显示全部楼层
eobeom 发表于 2020-10-17 19:48
不好意思我才看到,我明白了谢谢

明白了,就给个最佳答案呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 23:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表