C++ 多阶行列式求解
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
double GaussElimination2UTM(double* matrix, int dimension){
double sign=1;
double temp;
for(int cnt1=0; cnt1<dimension; cnt1++){
//在此引入置换操作,如果主元很小(小于0.001)那么进行行交换,此操作在行列式中引入了负号,消元函数返回行列式由于置换操作需要加入的符号
for(int cnt2=cnt1+1; cnt2<dimension; cnt2++){
if(abs(matrix[cnt1*dimension+cnt1])>1e-3) break;
for(int cnt3=0; cnt3<dimension; cnt3++){
temp=matrix[cnt1*dimension+cnt3];
matrix[cnt1*dimension+cnt3]=matrix[cnt2*dimension+cnt3];
matrix[cnt2*dimension+cnt3]=temp;
}
sign*=-1;
}
for(int cnt2=cnt1+1; cnt2<dimension; cnt2++){
for(int cnt3=dimension-1; cnt3>=cnt1; cnt3--){
matrix[cnt2*dimension+cnt3] += -1*matrix[cnt1*dimension+cnt3]*matrix[cnt2*dimension+cnt1]/matrix[cnt1*dimension+cnt1];
std::cout<<matrix[cnt2*dimension+cnt3]<<"="<<matrix[cnt1*dimension+cnt3]<<"*"<<matrix[cnt2*dimension+cnt1]<<"/"<<matrix[cnt1*dimension+cnt1]<<std::endl;
}
}
}
return sign;
}
double Determinant(double* matrix, int dimension){
double determinant=1;
determinant=GaussElimination2UTM(matrix, dimension);
std::cout<<"------------------------"<<std::endl;
for(int cnt=0; cnt<dimension; cnt++){
determinant *= matrix[cnt*dimension+cnt];
for(int jfd=0;jfd<dimension;jfd++){
std::cout<<","<<matrix[cnt*dimension+jfd];
}
std::cout<< std::endl;
}
return determinant;
}
int main(){
int dimension = 6;
double matrix[100]={
2,3,4,5,6,7,
10,9,13,14,15,16,
21,11,2,12,1,3,
4,5,7,9,3,2,
31,21,31,5,11,16,
4,2,8,9,4,8
};
cout << Determinant(matrix, dimension) << '\n';
return 0;
}