#include<iostream>
#include<math.h>
using namespace std;
#define N 10
const double p=1e-6;
void build(double matrix[N][N],int n);
void compute(double matrix[N][N],int n,int clue);
void exchange(double matrix[N][N],int n,int i,int j);
void multi(double matrix[N][N],int n,int clue);
void Triangular_matrix(double matrix[N][N],int n);
void show_matrix(double matrix[N][N],int n);
void result(double matrix[N][N],int n);
int main()
{
int n;
double MATRIX[N][N];
cout<<"enter the matrix size:"<<endl;
cin>>n;
build(MATRIX,n);//建立矩阵
Triangular_matrix(MATRIX,n);
show_matrix(MATRIX,n);
result(MATRIX,n);
}
void build(double matrix[N][N],int n)
{
cout<<"input matrix content:"<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin>>matrix[i][j];
}
}
void compute(double matrix[N][N],int n,int clue)
{
int count=0;
for(int i=0;i<n;i++)
{
if(fabs(matrix[i][clue])<=p)
count++;
}
//第clue列全为0
if(count==n)
{
cout<<"|matrix|=0";
exit(0);
}
//第clue列第clue个数为0
if(fabs(matrix[clue][clue])<=p)
{
for(int j=clue+1;j<n;j++)
{
if(fabs(matrix[j][clue])>p)
{
exchange(matrix,n,clue,j);
}
}
}
//第clue列第clue个数不为0
multi(matrix,n,clue);
}
//第i行和第j列交换
void exchange(double matrix[N][N],int n,int i,int j)
{
double temp;
for(int k=0;k<n;k++)
{
temp=matrix[i][k];
matrix[i][k]=matrix[j][k];
matrix[j][k]=temp;
}
}
void multi(double matrix[N][N],int n,int clue)
{
double temp;
for(int i=clue+1;i<n;i++)
{
if(fabs(matrix[i][clue])>p)
{
temp=matrix[i][clue]/matrix[clue][clue]*(-1);
for(int j=0;j<n;j++)
{
matrix[i][j]+=matrix[clue][j]*temp;
}
}
}
}
void Triangular_matrix(double matrix[N][N],int n)
{
int clue=0;
for(int clue=0;clue<n-1;clue++)
{
compute(matrix,n,clue);//矩阵计算
//show_matrix(matrix,n);
}
}
void show_matrix(double matrix[N][N],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<matrix[i][j]<<"\t";
}
cout<<endl;
}
}
void result(double matrix[N][N],int n)
{
double result=1;
for(int i=0;i<n;i++)
result*=matrix[i][i];
cout<<"|matrix|="<<result<<endl;
}
步骤1:首先观察第clue列,若第clue列的元素全为0,则行列式的值为0,结束计算。否则,再观察第clue列第clue个元素;
步骤2:若为零,则将第clue行与其他行数大于clue的某行交换位置,使得不为零,从而继续计算;
步骤3:若不为零,则将第clue行元素分别乘以合适的数加到其他大于clue的行上去,使第clue列除第clue行元素以外的其他元素均为零;
假设行列式为n*n的,那么clue从0开始递增到n-1最终转化为一个上三角行列式。
比如,
具体怎样将每一列需要化为0的行数化为0,可以看代码!