行列式求值(化为对角式)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

采用的是多文件编译,作者环境是vc6.0++

文件1 ValDet.h

/******************************************************** 本程序采用C++类模式求行列式的值,

类入口函数为CalcDet(ValDet det),用户需要创建对象作为输入.

算法基本思想是将行列式化为对角形式,然后再使对角线上

的值相乘.

行列式的值装在容器vector中,double型,由于算法的原因,

不能保证精度.

********************************************************/

#ifndef _V ALDET_H

#define _V ALDET_H //预编译.

#include

#include //使用容器vector.

using namespace std;

class ValDet

{

private:

int lin;

int col; //记录对角线的当前行,列.

//以下四个函数都是被CalcDet(ValDet det)调用的函数,故设为private型.

int Exchange(vector &M,const int &lin,const int &col,int n);

int FindNonZero(vector &M,const int &lin,const int &col,int n);

void AdjDet(vector &M,int &lin,int &col,int n);

void InDet(vector &m,int &n);

public:

ValDet(); //类构造函数.

double CalcDet(ValDet det); //计算函数.类入口函数.

};

#endif

文件二, ValDet.cpp

#include

#include

#include //测试用,用于生成随机行列式值.

#include "ValDet.h" //引入头文件.

using namespace std;

ValDet::ValDet()

{

lin=0; //将对角线当前元素设为0行0列.

col=0;

}

int ValDet::Exchange(vector &M,const int &lin,const int &col,int n)

{

int i=lin+1; //从下行开始找.

int j=col; //保存列.

while (i

{

if(M[i*n+j]!=0) //如果找到一个当前列不为0的.

{

while(j

{

double temp=M[lin*n+j];

M[lin*n+j]=M[i*n+j]=temp;

M[i*n+j]=temp;

j++;

}

M[lin*n+col] *=-1; //行列式运算规则,交换两列,最终值乘以-1,此处顺便处理了.

return 1; //若找到,返回1.

}

i++; //没找到,对下一行处理.

}

return 0; //最终没有找到,返回0.

}

/******************************************************************** *********

该函数作用是保证当前行上处于对角线位置上的元素值不为0.

若不为0返回1,否则试着找到一行的当前列元素不为0,并使二行的值交换.若找不到,则

返回0.

********************************************************************* ********/

int ValDet::FindNonZero(vector &M,const int &lin,const int &col,int n) {

if(M[lin*n+col]==0)

return Exchange(M,lin,col,n);

return 1;

}

/***************************************************************** 此函数的作用是用当前行使以下所有行的当前列值变为0,其他的元素执行相同操作.

同其他函数,此函数的值采用引用的方法.

*****************************************************************/ void ValDet::AdjDet(vector &M,int &lin,int &col,int n)

{

int i=lin; //当前行.

int k=i+1; //下一行.

while(k

{

if(M[k*n+col]!=0) //如果当前列不为0则处理.

{

double temp=(-1)*M[k*n+col]/M[i*n+col]; //先算出位数.

for(int j=col;j

M[k*n+j]+=temp*M[i*n+j];

}

k++; //下一行.

}

lin++; //转向下一行的对角线值.

col++;

//cout<<"AdjDet_lin :"<

}

//行列式的输入函数.

void ValDet::InDet(vector &M,int &n) //采用引用的方式.

{

srand((unsigned)time(NULL)); //此为测试用,用于随机生成行列式的值.

cout<<"请输入行列式的阶数: "; //测试用.

cin>>n; //输入阶数.

double temp=0; //中间值.

for(int i=0;i

{

for(int j=0;j

{

//cin>>temp; //输入值.

temp=rand()%20; //测试用,随机生成.

相关文档
最新文档