本贴是用于求行列式的模板贴。
按行(列)展开递归求行列式
特点:对于int型该方法是封闭的,所有过程可全部用int型完成,不需要转换成double,当然double型也可以用。
struct Matrix
{
int matrix[MAXN][MAXN] = {{0}};
int n;
void Matrix_input(int N)
{
n = N;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
scanf("%d", &matrix[i][j]);
}
};
int det(Matrix m)
{
Matrix b;
int det_num = 0;
int p = 0, q = 0;
if(m.n == 1) return m.matrix[0][0];
for(int i = 0; i < m.n; i++)
{
for(int c = 0; c < m.n-1; c++)
{
if(c < i) p = 0;
else p = 1;
for(int j = 0; j < m.n-1; j++)
b.matrix[c][j] = m.matrix[c+p][j+1];
}
if(i%2==0) q = 1;
else q = -1;
b.n = m.n - 1;
det_num += (m.matrix[i][0]*q*det(b));
}
return det_num;
}
高斯消元法求行列式(化上三角)
const double eps = 1e-6;
void Swap(int &a, int &b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
struct Matrix
{
double matrix[MAXN][MAXN] = {{0}};
int n;
void Matrix_input(int N)
{
n = N;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
scanf("%lf", &matrix[i][j]);
}
};
bool zero(double a)
{
return a > -eps && a < eps;
}
double Gauss_det(Matrix m)
{
double mul, result = 1;
int b[m.n];
for(int i = 0; i < m.n; i++) b[i] = i;
for(int i = 0; i < m.n; i++)
{
if(zero(m.matrix[b[i]][i]))
for(int j = i+1; j < m.n; j++)
if(!zero(m.matrix[b[j]][i]))
{
Swap(b[i], b[j]);
result *= -1;
break;
}
result *= m.matrix[b[i]][i];
for(int j = i+1; j < m.n; j++)
if(!zero(m.matrix[b[j]][i]))
{
mul = m.matrix[b[j]][i] / m.matrix[b[i]][i];
for(int k = i; k < m.n; k++)
m.matrix[b[j]][k] -= m.matrix[b[i]][k]*mul;
}
}
return result;
}