行列式的计算有一点难度,但并不是因为它的算法复杂,而是因为行列式定义的计算方法在运算上很复杂。换句话说,就是使用行列式定义来计算行列式的值的话,程序运算量将非常大。我们看一下行列式的标准定义:
其中 t 为排列P1、P2、P3的逆序数,是列表对1、2、3三个数的所有排列P1 P2 P3取和。我们可以看到对于N阶行列式的排列计算量非常的大,每一个排列都将是N!,所以我们将采用另一种方式来计算行列式的值:
行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即:
其中A为a的代数余子式。我们来看一下代码实现:
//计算行列式 int matrix_determinant(num *result, s_Matrix *src) { if (src == null) { return -1; } if (src->v == null) { return -1; } if (src->m <= 0 || src->n <= 0) { return -1; } //行列式的行数与列数必须相同 if (src->m != src->n) { return -1; } if (result == null) { return -1; } if (src->m == 1) { *result = src->v[0]; return 0; } //如果是2阶行列式 if (src->m == 2) { //直接计算 *result = src->v[0] * src->v[3] - src->v[1] * src->v[2]; return 0; } num s = 0; //计算其中一行 for (int k = 0; k < src->m; k++) { num det = 0; s_Matrix cofactor; matrix_init(&cofactor, src->m - 1, src->n - 1); //计算代数余子式 for (int i = 1, ci = 0; i < src->m; i++, ci++) { for (int j = 0, cj = 0; j < src->n; j++) { if (j != k) { cofactor.v[ci * cofactor.n + cj] = src->v[i * src->n + j]; cj++; } } } //递归计算代数余子式 matrix_determinant(&det, &cofactor); matrix_destory(&cofactor); //当前元素乘以其代数余子式的累加和 s += src->v[k] * pow(-1, 0 + k) * det; } //返回行列式的值 *result = s; return 0; }
本教程所使用的源代码完全开放、免费。你可以自由的使用和修改本教程中的所有源代码:
git@github.com:magicworldos/matrix.git https://github.com/magicworldos/matrix.git
Copyright © 2015-2023 问渠网 辽ICP备15013245号