这是一个系列,本意为计算任意NxN矩阵的行列式,但是由于本人才疏学浅,苦想很多天未能如愿。
所以在此先列出2x2,3x3,4x4,5x5,6x6,7x7......以寻求突破。如果各位有好点子也希望大家一起讨论。Ps(本人只是初学C语言,C++等诸多语言尚未尝试,还请大家多多关照)
上才艺,哦不,上代码。
#include
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{}中的操作可以理解为:筛选->操作。目的是找到符合要求的行列式(阅读矩阵相关知识)。接下来就是判断,奇偶排列,然后加上正负号,进行累加计算。那么单纯的去找逆排列过于通途(实在没想出来)。
但是我观察了一下
可以看到奇偶排列式有规律出现的,我把4个数字为一组,第N项除以4的余数为相对应的奇偶性。且第一项必为偶排列。看到这里估计你已经明白JeGuo的意思了。(实在不知道该怎么组织预言了/^_^/)
好了就先这样子有问题咱们再一起讨论!
------------------------------------------------------2021/4/5------------------------------------------------------------------------