本贴是用于求行列式的模板贴。

按行(列)展开递归求行列式

特点:对于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;
}