C语言编写的计算4*4矩阵行列式的小程序

后知后觉

这是一个系列,本意为计算任意NxN矩阵的行列式,但是由于本人才疏学浅,苦想很多天未能如愿。
所以在此先列出2x2,3x3,4x4,5x5,6x6,7x7......以寻求突破。如果各位有好点子也希望大家一起讨论。Ps(本人只是初学C语言,C++等诸多语言尚未尝试,还请大家多多关照)
才艺,哦不,上代码。

#include<stdio.h>
int JvZhen(int axx[4][4])                   /*此处是JvZhen函数的输入值,
                                            此处需要输入一个二维矩阵。*/
{
    int a, b, c, d;                         /*此处的逻辑为比方说一个4x4的矩阵竖列循环排列
                                            {1,2,3,4}那么a对应[1,1,1,1]这一列
                                            {1,2,3,4}    b对应[2,2,2,2]这一列
                                            {1,2,3,4}    c对应[3,3,3,3]这一列
                                            {1,2,3,4}    d对应[4,4,4,4]这一列*/
    int i = 0, k = 0, j = 0,JeGuo=0;        /*i,j,k为算数需要的工具数字。这类东西我
                                            一般不太愿意用于过长的命名,影响思路。
                                            但是还是推荐写出目的名字。
                                            因为后期计算量大的时候名称指代不清实在闹人眼睛。*/
    for (a = 1; a <= 4; a++)
    {
        for (b = 1; b <= 4; b++)
        {
            for (c = 1; c <= 4; c++)
            {
                if (b == a) { break; }/*作用同下*/
                for (d = 1; d <= 4; d++)
                {
                      if (c == b || c == a) { break; }      /*去掉不必要的计算,如果a=b或者
                                                            两两相等的话就不需要遍历下去了,
                                                            调试的时候你就会明白,
                                                            break能拯救你的时间*/
                    if (d!=c&&d!=b&&d!=a&&c!=b&&c!=a&&b!=a )/*这是一个判定式,原理很简单整个循环4次嵌套,筛选出需要的。筛选的依据在下面*1中解释。*/
                    {
                    /*printf("| %d,%d,%d,%d,|",a,b,c,d);此处是打印出行列式的各项,
                    在此处后面的代码本来是需要做奇偶排列的筛选但是,
                    就排列有捷径可循在下面*2处解释*/
                        i++;
                        k = i % 4;
                        if (k == 0 || k == 1)
                        {
                            JeGuo = JeGuo + axx[0][a-1] * axx[1][b-1] * axx[2][c-1] * axx[3][d-1];
                        }
                        
                        else if (k == 2 || k == 3)
                        {
                            JeGuo = JeGuo - axx[0][a-1] * axx[1][b-1] * axx[2][c-1] * axx[3][d-1];
                        }
                    }
                }
            }
        }
        //printf("\n");此处配合上面printf("| %d,%d,%d,%d,|",a,b,c,d);这一句使用//
    }
    return JeGuo;
}
int main()
{
    int abb[4][4] = { {1,2,9,2},{2,7,2,1,},{1,2,4,2},{2,1,2,5} };
    /*此处为输入矩阵*/
    printf("%d",JvZhen(abb));
    return 0;
}

*1这里呢简单的解释一下,请用循环中语句中 printf("| %d,%d,%d,%d,|",a,b,c,d); 这一句你将会得到24个不重复的排列式,像这样

| 1,2,3,4|| 1,2,4,3|| 1,3,2,4|| 1,3,4,2|| 1,4,2,3|| 1,4,3,2|
| 2,1,3,4|| 2,1,4,3|| 2,3,1,4|| 2,3,4,1|| 2,4,1,3|| 2,4,3,1|
| 3,1,2,4|| 3,1,4,2|| 3,2,1,4|| 3,2,4,1|| 3,4,1,2|| 3,4,2,1|
| 4,1,2,3|| 4,1,3,2|| 4,2,1,3|| 4,2,3,1|| 4,3,1,2|| 4,3,2,1|

根据矩阵的行列式定理可知,这里的每一组数对应a(i)(j)的j ,(此处i,j是矩阵的项而不是代码中的i,j)
举个例子;第一个,|1,2,3,4|对应的是a(1)(1),a(2)(2),a(3)(3),a(4)(4)。但是,二维数组的项是从0开始的,所以在程序中下角标为

axx[0][a-1] * axx[1][b-1] * axx[2][c-1] * axx[3][d-1];

本人语言水平有限,暂时这么解释,以后会慢慢优化。如果难以理解,请仔细阅读翻阅矩阵相关的书籍
*2
这里呢也是简要的说明一下,这个4次嵌套的循环,是输出用1234,四个数字组成四位数组的所有情况,If{}中的操作可以理解为:筛选->操作。目的是找到符合要求的行列式(阅读矩阵相关知识)。接下来就是判断,奇偶排列,然后加上正负号,进行累加计算。那么单纯的去找逆排列过于通途(实在没想出来)。
但是我观察了一下

image.png
可以看到奇偶排列式有规律出现的,我把4个数字为一组,第N项除以4的余数为相对应的奇偶性。且第一项必为偶排列。看到这里估计你已经明白JeGuo的意思了。(实在不知道该怎么组织预言了/^_^/)
好了就先这样子有问题咱们再一起讨论!
------------------------------------------------------2021/4/5------------------------------------------------------------------------

阅读 431

bug,or debug;this is a sh*t

1 声望
0 粉丝
0 条评论
你知道吗?

bug,or debug;this is a sh*t

1 声望
0 粉丝
宣传栏