其实高斯消元解决的是n元方程组。形如
10*x + 5 * y + 7 * z = 2
5 * x + 4 *y + 11 * z = 3
4 * x+ 3*y + 10 * z = 0
利用线性代数的知识,首先将其中的系数提出:
10 5 7 -2
5 4 11 -3
4 3 10 0
然后对其进行化简得到最简化的行列式,其中矩阵的秩就是非零元的个数,对于其次方程组来说,n - 矩阵的秩 = 自由元的个数
例子:这个示例是一个特殊的示例。矩阵中的系数只能是0,1方程的解x,y,z也只能是0,1。求矩阵的秩
分析:从第0行开始,判断当前第i行第j个数是否是1,如果不是就向下找,如果找的到,那就交换该i行,与找到的那行。如果当前的j,即这一列的数都是零,那么i不增加(反之增加)。找到并交换之后,对在其下面的行,如果第j列是1的话,就将整个行与第i行异或(相当于减去了第i行)。最后i的值就是秩,表示多少个非零行
代码:
int A[maxn][maxn];
int rank2(int n,int m)
{
int i = 0,j = 0,r;
while(i < n && j <m )
{
for(r = i; r < n; r ++)
{
if(A[r][j])
{
break;
}
}
if(A[r][j])
{
if(i != r)
{
for(int k = 0; k < m; k ++)
{
swap(A[i][k],A[r][k]);
}
}
for(r = i+ 1; r < n; r ++)
{
if(A[r][j])
{
for(int k = 0; k < m; k ++)
{
A[r][k] ^=A[i][k];
}
}
}
i ++;//只有当A[r][j] != 0 时,才有i++。才用到了当前行
}
j ++;
}
return i;
}