计算行列式的三种方法
测试样例
10
1 3 4 0 2 0 4 -5 9 3
6 7 8 5 2 7 8 4 6 2
8 7 6 9 8 7 6 8 45 2
4 3 2 5 4 3 2 8 6 4
1 2 0 4 1 2 3 9 87 6
5 6 7 8 5 6 8 6 8 1
9 8 7 6 9 8 7 -9 2 3
5 6 3 5 4 1 8 7 9 2
-9 8 6 2 4 56 6 3 8 9
5 3 6 8 6 6 1 8 2 3
答案:7583304
按行(列)展开法
d e t ( A n ∗ n ) = ∑ j = 1 n a i j A i j , ( i = 1 , 2 , . . . , n ) det(A_{n*n}) = \sum\limits_{j=1}^na_{ij}A_{ij},(i=1,2,...,n) det(An∗n)=j=1∑naijAij,(i=1,2,...,n)
或
d e t ( A n ∗ n ) = ∑ i = 1 n a i j A i j , ( j = 1 , 2 , . . . , n ) det(A_{n*n}) = \sum\limits_{i=1}^na_{ij}A_{ij},(j=1,2,...,n) det(An∗n)=i=1∑naijAij,(j=1,2,...,n)
#include <iostream>
#include <fstream>
using namespace std;
//构造第一行第line个元素的余子式
void StructMinor(double* matrix, int dimension, int line, double* minor){
int ptr=0;
for(int cnt1=1; cnt1<dimension; cnt1++) for(int cnt2=0; cnt2<dimension; cnt2++)
if(line!=cnt2) minor[ptr++] = matrix[cnt1*dimension+cnt2];
return;
}
double Determinant(double* matrix, int dimension){
//递归基,当矩阵中只有一个元素的时候,行列式的值即为实数值
if(dimension <= 1) return *matrix;
double minor[(dimension-1)*(dimension-1)];
double determinant = 0;
int sign = 1;
for(int cnt=0; cnt<dimension; cnt++){
//构造matrix[0][cnt]的余子式
StructMinor(matrix, dimension, cnt, minor);
//determinant=ΣELEMENT0j*A0j
determinant += sign*matrix[cnt]*Determinant(minor, dimension-1);
sign *= -1;
}
return determinant;
}
int main(){
int dimension;
int scale;
double matrix[100