欢迎光临散文网 会员登陆 & 注册

用C语言计算行列式

2021-02-16 22:27 作者:风氢云氮  | 我要投稿

如何用C语言计算行列式?


首先我们来看一个一般的三阶行列式

D%3D%0A%5Cleft%7C%5Cbegin%7Barray%7D%7Bc%7D%20%0A%20%20%20%20a_%7B11%7D%20%26%20%20%20%20a_%7B12%7D%20%20%20%20%26%20a_%7B13%7D%20%5C%5C%20%0A%20%20%20%20%20a_%7B21%7D%20%26%20%20%20%20%20a_%7B22%7D%20%20%20%26%20%20a_%7B23%7D%5C%5C%20%0A%20%20%20%20%20a_%7B31%7D%20%26%20%20a_%7B32%7D%20%26%20%20a_%7B33%7D%20%0A%5Cend%7Barray%7D%5Cright%7C

对于这么一个行列式我们可以用利用余子式来计算,具体一点就是取这个行列式第一行的每一个元素分别乘以对应的代数余子式,再相加

D%20%3D%20a_%7B11%7DA_%7B11%7D%20%2B%20a_%7B12%7DA_%7B12%7D%20%2Ba_%7B13%7DA_%7B13%7D

每个余子式又都是二阶行列式,这时就可以用对角线法则来计算。这样就得到了D的值。


下面来考虑如何用代码实现这一过程。

1. 创建一个N阶行列式

  • 为了便于得到余子式,可以用结构体储存每一行的元素,并用链表链接这些结构体

  • 参数:N 行列式阶数

2. 创建余子式

  • 创建余子式与创建行列式异曲同工,先得到已经创建好的行列式指针,再创建一个N-1阶行列式,并对新行列式赋上旧行列式除第一行第c列的元素

A_%7B12%7D%20%3D%20%5Cleft%7C%5Cbegin%7Barray%7D%7Bc%7D%20%0A%20%20%20%20%EF%BC%9F%20%26%20%20%20%20%EF%BC%9F%20%20%20%20%5C%5C%20%0A%20%20%20%20%20%EF%BC%9F%20%26%20%20%20%20%20%EF%BC%9F%20%20%20%0A%5Cend%7Barray%7D%5Cright%7C%0A%3D%20%5Cleft%7C%5Cbegin%7Barray%7D%7Bc%7D%20%0A%20%20%20%20%7B%5Ccolor%7Bred%7D%20%7Ba_%7B11%7D%7D%7D%20%26%20%20%20%20%20%7B%5Ccolor%7Bred%7D%20%7Ba_%7B12%7D%7D%7D%20%20%20%20%26%20%20%7B%5Ccolor%7Bred%7D%20%7Ba_%7B13%7D%7D%7D%20%5C%5C%20%0A%20%20%20%20%20%20%7B%5Ccolor%7Bgreen%7D%20%7Ba_%7B21%7D%7D%7D%20%26%20%20%20%20%20%20%7B%5Ccolor%7Bred%7D%20%7Ba_%7B22%7D%7D%7D%20%20%20%26%20%20%7B%5Ccolor%7Bgreen%7D%20%7Ba_%7B23%7D%7D%7D%20%5C%5C%20%0A%20%20%20%20%20%7B%5Ccolor%7Bgreen%7D%20%7Ba_%7B31%7D%7D%7D%20%26%20%20%7B%5Ccolor%7Bred%7D%20%7Ba_%7B32%7D%7D%7D%20%26%20%20%7B%5Ccolor%7Bgreen%7D%20%7Ba_%7B33%7D%7D%7D%20%20%0A%5Cend%7Barray%7D%5Cright%7C    

此处c为2,即得

A_%7B12%7D%20%3D%20%5Cleft%7C%5Cbegin%7Barray%7D%7Bc%7D%20%0A%20%20%20%20a_%7B21%7D%20%26%20%20%20%20a_%7B23%7D%20%20%20%20%5C%5C%20%0A%20%20%20%20%20a_%7B31%7D%20%26%20%20%20%20%20a_%7B33%7D%20%20%20%0A%5Cend%7Barray%7D%5Cright%7C

  • 参数:p 原行列式指针、N 原行列式阶数、c去除的列数

3. 计算

  • 计算行列式要根据阶数分情况讨论

    %5Cleft%5C%7B%0A%5Cbegin%7Barray%7D%7Blcl%7D%0A%E5%8D%B3%E4%B8%BA%E8%AF%A5%E5%85%83%E7%B4%A0%E6%9C%AC%E8%BA%AB%20%20%20%20%20%26%20%20%20%20%20%20%26%20%7BN%20%3D%201%7D%5C%5C%0A%E5%88%A9%E7%94%A8%E5%AF%B9%E8%A7%92%E7%BA%BF%E6%B3%95%E5%88%99%20%20%20%20%20%26%20%20%20%20%20%20%26%20%7BN%20%3D%202%7D%5C%5C%0A%E5%88%A9%E7%94%A8%E4%BD%99%E5%AD%90%E5%BC%8F%E8%AE%A1%E7%AE%97%20%20%20%20%20%26%20%20%20%20%20%20%26%20%7BN%20%3E%202%7D%5C%5C%0A%5Cend%7Barray%7D%20%5Cright.

  • 参数:p 待计算的行列式指针、N 行列式阶数

4. main函数


所需的函数已经准备好,接下来看看main函数。

主要的就是创建行列式,并且对每一行赋值

*使用的是scanf_s,而非scanf

  • 整体代码如下

最后开始计算!

1.

输入:

    1

    5

输出:

示例1

2.

输入:

    2

    2    3

    4    7

输出:

示例2

3.

输入:

    6

    5    4    6    1    9    5

    4    9    5    2    4    7

    3    6    9    2    5    7

    1    6    2    4    7    8

    2    3    8    9    4    2

    4    5    6    8    1    3

输出:

示例3

 4.

输入:

    5

    1    8    9    4    6

    0    2    6    8    7

    0    0    3    5    9

    0    0    0    4    7

    0    0    0    0    5

输出:

示例4——上三角行列式

好像算到10多阶的时候,算的时间就比较长了,阶数再大一点就会崩溃,可能是没有free内存的缘故,又或者是栈溢出?不过我懒管了啊啊啊啊啊哈哈哈哈哈哈哈哈哈。

用C语言计算行列式的评论 (共 条)

分享到微博请遵守国家法律