矩阵基本运算

    返回首页    发表留言
本文作者:李德强
          第五章 行列式计算
 
 

        行列式的计算有一点难度,但并不是因为它的算法复杂,而是因为行列式定义的计算方法在运算上很复杂。换句话说,就是使用行列式定义来计算行列式的值的话,程序运算量将非常大。我们看一下行列式的标准定义:

        其中 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-2018 问渠网 辽ICP备15013245号