求解矩阵行列式

来源:互联网 发布:ubuntu 恢复图形界面 编辑:程序博客网 时间:2024/04/30 14:48

写了个求矩阵行列式的函数,经过测试了,后面有示例函数。

matrix_det.h//这个头文件后面要用到,以后不要说不知道

//放在头文件里
namespace jks
{
//////////////////////////////////////////////////////////////////////////

inline long factorial(int n)
{
// assert(n>0);
 long result=1;
 while(n>0)
  result*=n--;
 
 return result;
}

inline int inversionnum(int a[],int n)
{
    int i,j;
    int t=0;
    for(i=0;i<n-1;i++)
      for(j=i+1;j<n;j++)
         if(a[i]>a[j])
            t++;
    return t;
}

template<typename T>
double matrix_det(T* p,int n)
{
 int i,j,count;
 int *array;
 array = new int[n];
 double t=1.0;
 double result=0;

 // to initiate the array/
 for(i=0;i<n;i++)
  array[i]=i;

 for(count=0;count<factorial(n);count++)
 {
  t=1;
  for(i=0;i<n;i++)
  {
   j=array[i];
   t=t*p[i*n+j];
  }
  if(inversionnum(array,n)%2==1)
   result+=-t;
  else
   result+=t;

  int i1,j1;
  int temp;
  for(i1=n-2;i1>=0;i1--)
   if(array[i1]<array[i1+1]) break;
  for(j1=n-1;j1>i1;j1--)
   if(array[j1]>array[i1]) break;

  int start;
  if(i1<0||j1<0)
   goto Out;
   
  temp=array[i1];
  array[i1]=array[j1];
  array[j1]=temp;
    
   start = i1+1;
  int i2,j2;
  for(i2=start;i2<n;i2++)
   for(j2=start;j2<n-1;j2++)
     if(array[j2]>array[j2+1])
     {
    int t=array[j2];
   array[j2]=array[j2+1];
   array[j2+1]=t;
     }
Out: ;
 }

 delete []array;
 return result;
}
//////////////////////////////////////////////////////////////////////////

+++++++++++++++++++++++示例

int example()
{
 double p[3][3]={0,0,3,0,3,0,3,0,0};
 cerr<<jks::matrix_det(p[0],3)<<endl;
}

传闻中的begtostudy之编程技术文集