方阵行列式的求解是线性代数学习的重要内容,行列式能显示矩阵的某些重要特性,如:行列式的值不为0,表示方阵可逆。此外,行列式在几何上表示空间几何体的体积,这里就不详细展开论述,具体可以参见相关线性代数教材!
在线性代数教材中,常用按行/列展开方式求解方阵行列式,所以根据这个思路,我编写了相应的C语言程序:该程序采用了递归的方法,由于递归方式会耗用大量内存空间,所以本程序存在相应的缺点,经测试,最高只能计算7*7阶方阵行列式(可以计算个别8*8阶方阵行列式),但对于大学线性代数课程的方阵求解完全够用,而且涉及到递归的使用,二维数组作为函数参数传递等C语言知识点的学习有一定意义。
本程序在主函数采用了循环输入的矩阵的阶,并用随机数生成相应的方阵,方阵元素在1~9中随机取值,在对方阵进行求解行列式,读者可根据需要修改主函数,实现自己需要的功能,本程序是在Ubuntu14.04系统下书写的,采用文本编辑器为Vim,编译器为Gcc,程序代码如下:
/*=======================================================
# Author: Joker@HIT NolanRobot@163.com
# Filetype: C source code
# Date: Mon Aug 22 2016
# Environment: Linux & Ubuntu 14.04
# Tool: Vim & Gcc
# Descprition: Solve square matrix's (n*n) determinant
by recursion, but limited by the core
storage, the max size is 7*7.
=======================================================*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 8
int calculate(int [][MAX_ROW], int);
void exchange(int [][MAX_ROW], int, int);
int main(void)
{
int matrix[MAX_ROW][MAX_ROW];
int det_value;
int row, i, j, dim;
srand((unsigned int)time(0));
printf("Enter the matrix size: ");
while(scanf("%d", &row)==1){
if(row<=0||row>MAX_ROW){
printf("The matrix size is out of range, input again!\n");
continue;
}
printf("Create %d*%d random matrix!\n", row, row);
dim = row;
for(i=0;i<row;i++){
for(j=0;j<row;j++){
matrix[i][j] = rand() % 9 + 1;
printf("%-4d", matrix[i][j]);
}
putchar('\n');
}
det_value = calculate(matrix, dim);
printf("The det value is %d\n", det_value);
printf("Enter the matrix size (q to quit): ");
while(getchar()!='\n')
continue;
}
return 0;
}
int calculate(int matrix[MAX_ROW][MAX_ROW], int dim)
{
int replica[MAX_ROW][MAX_ROW];
int vector[dim];
long result = 0L;
int i, j, k;
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
replica[i][j] = matrix[i][j];
for(i=0;i<dim;i++)
vector[i] = matrix[0][i];
if(dim==1)
result = matrix[0][0];
else
for(i=0;i<dim;i++){
exchange(matrix, dim, i);
if(i%2==0)
result += vector[i] * calculate(matrix, dim-1);
else
result -= vector[i] * calculate(matrix, dim-1);
for(j=0;j<dim;j++)
for(k=0;k<dim;k++)
matrix[j][k] = replica[j][k];
}
return result;
}
void exchange(int matrix[MAX_ROW][MAX_ROW], int dim, int flag)
{
int i, j;
for(i=0;i<dim-1;i++)
for(j=0;j<dim;j++)
matrix[i][j] = matrix[i+1][j];
for(j=flag;j<dim;j++)
for(i=0;i<dim-1;i++)
matrix[i][j] = matrix[i][j+1];
return;
}
运行结果如下图所示:
如上图所示,循环输入矩阵大小,自动生成随机数矩阵,并计算方阵行列式的值,按q退出!
如果大家有什么修改意见,欢迎留言或者邮箱探讨,对于代码的不足还望大家多多指正!