伴随矩阵的计算方法比较简单,但是它的计算需要用到我们之前的行列式计算的函数。它的定义是:将矩阵中的每一个元素抹去它所在的行和列,从而得到新的行列式的值作为这个元素所在位置的值。这样,这个新矩阵就叫作原矩阵的伴随矩阵。
我们来看一下代码:
//伴随矩阵
int matrix_adjoint(s_Matrix *result, s_Matrix *src)
{
if (result == null)
{
return -1;
}
if (result->v == null)
{
return -1;
}
if (result->m <= 0 || result->n <= 0)
{
return -1;
}
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;
}
result->m = src->m;
result->n = src->n;
if (src->m == 1)
{
result->v[0] = 1;
return 0;
}
int cm = src->m - 1;
int cn = src->n - 1;
s_Matrix cofactor;
matrix_init(&cofactor, cm, cn);
//计算每一个元素的代数余子式并作为这个元素所在位置的值
for (int i = 0; i < src->m; i++)
{
for (int j = 0; j < src->n; j++)
{
for (int k = 0, ck = 0; k < src->m; k++)
{
//抹去第i行
if (k != i)
{
for (int l = 0, cl = 0; l < src->n; l++)
{
//抹去第j列
if (l != j)
{
//计算值
cofactor.v[ck * cofactor.n + cl] = src->v[k * src->n + l];
cl++;
}
}
ck++;
}
}
num det = 0;
//计算代数余子式
matrix_determinant(&det, &cofactor);
//用代数余子式做为新元素
result->v[j * result->n + i] = pow(-1, i + j) * det;
}
}
matrix_destory(&cofactor);
return 0;
}
本教程所使用的源代码完全开放、免费。你可以自由的使用和修改本教程中的所有源代码:
git@github.com:magicworldos/matrix.git https://github.com/magicworldos/matrix.git
Copyright © 2015-2023 问渠网 辽ICP备15013245号