date
slug
status
tags
summary
type
在这里感谢我的学长以及
前言
前几天刚开始学线性代数,于是就想用C++复现一下
本来以为是很简单的,但是后期纠错花了好几个晚上才搞定
C++源码已上传至GitHub
项目地址
源码
解析
n阶行列式定义
这里将行列式中的每项视为一个二维数组
其中在开头定义的常量
为本程序所能运算的最大阶数
n阶行列式的定义式
可以看出:
n阶行列式在运算时由两个部分组成
- 第一部分是系数,在所选的序列的总逆序数为偶数时取1,奇数为-1
- 第二部分是所选序列的累乘那么在编写程序时也可分成这两项来分别编写n阶行列式的构成其中,系数k由函数
t(int p[N],int n)
生成累乘部分由函数product(double x[max_n][max_n],int p[N],int n)
生成
系数的生成
由于定义中规定不能选中同行同列的项相乘,但由于这个实现起来比较麻烦,所以就将同列的情况所对应系数为0
即:
- 序列为偶逆序,函数返回1
- 序列为奇逆序,函数返回-1
- 序列为同列,函数返回0
累乘的生成
这个没什么好说的,将结果的值先初始化为1,然后从序列p[]中读取每轮所要取第几行第几列的值,然后用
for
循环实现累乘即可序列的生成
这个想了很久,后来请教了我计科的学长,用n位n进制来实现:
这是一个n*n的矩阵,每行取一个数,需要遍历每一种结果,因此共有n^n种不同的取法
那么可以由这么一个数表示每行所要取第几列,也就是一个n位长的数,每一轮个位都自增1,逢n进1,直到n^n种情况遍历完为止
这个数的每一位都表示该行取第几列,比如个位数表示第一行取第几位,十位数表示第二位取第几位,n位数表示第n行取第几位
每次先自增1,再由一个
for
循环嵌套if
来判断是否需要进位为方便,就将这段序列数存储在了数组
p[]
中并且在此之前需要将数组初始化
这段代码被写在了
sum(double x[max_n][max_n],int n)
中所遇到的问题
1. 数组索引溢出
定义数组时用的
x[max_n][max_n]
,但是在for
循环中所遍历的范围是1-max_n,超出了数组所定义的范围所以后期调整为遍历0-max_n
2. 乘方的表示
之前写乘方时使用的是
n^n
,但在C++中^
表示异或正确的方式是在头文件中调用
<cmath>
,然后使用pow()
函数附
pow()
函数的使用方法:pow(x,y)
表示x的y次方3. C++环境出错
后来发现所有的错误都排除了,但是还是不能正常输出D的值,但是在学长的电脑上能正常运行的,因此发现是环境问题
将VSCode换为Dev C++后居然就能正常运行了
目前该问题笔者还在研究中
小结
肝这个代码花了我近四天晚上的时间来构思和修改错误
尽管并非作业,但是能用自己所学的C++来实现某项功能还是很有成就感的
也很感谢有大佬在我遇到困难时能出手相助
- 作者:Steven Lynn
- 链接:https://blog.stv.lol/article/implementing-nth-order-determinant-calculation-in-cpp
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章