开始重新学习数学了,然而路途总是不那么平坦,尽管是先挑选的最简单的线性代数,然而一开始就进展不顺
当然我承认数学一直都是一个难以言说的伤痛,但是像什么三阶行列式计算还是老是算错我就有点难以忍受了
于是编写一个程序解决行列式的计算问题,记得好像当初学线性代数的时候也想过编程实现,最终好像因为水平问题没能成功?哎,反正也是很早之前的事情了。
废话少说,先介绍一下大体的思路吧。核心的计算方法采用的是同济大学数学系 工程数学线性代数第六版中的行列式定义,数表中项的全排列的冠以排列逆序确定的符号位的求和(描述不清,详情参考标准表述),我记得我们学校的教材好像并没有这些内容(lll¬ω¬)。于是乎实现方式完全依照定义的方法,在获取到一个矩阵之后,计算出其全排列,然后按排列值取对应项的乘积并计算排列的奇偶逆序确定是否需要乘以-1.
完整代码直接粘贴如下,主要流程就是从stdin读取矩阵数据,计算出行列值,然后以行列值计算全排列,全排列的算法是很久之前写的了,相关细节都忘了,直接改了一下就拿来用了。得到全排列值后就按照定义计算即可。其中主要涉及了几个简单的数学计算比如al_factorial计算阶乘,用来计算全排列需要的存储空间,al_reverseidx计算逆序,直接按照定义来的,感觉可以有更高效的算法,al_fullarray计算全排列。大部分代码其实都是在处理IO,理论上能够处理各种不太完美的输入,但是具体是否还有bug就不得而知了,可能还是存在问题的,不过本来也是写着玩的,也不想过多纠缠于此了。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct matrix
{
int c;
int r;
int *vals;
};
#define MATRIX_INIT (struct ma