使用vector实现矩阵,并计算N阶矩阵的行列式

来源:互联网 发布:金融类软件测试薪资 编辑:程序博客网 时间:2024/04/30 09:50

 // ***************************************************************
//  main   version:  1.0   ·  date: 07/19/2008
//  -------------------------------------------------------------
//  该程序使用递归的方法来求取N阶矩阵的行列式,其中矩阵使用vector
//  来表示,求取行列式的方法为代数余子式展开的方式
//  -------------------------------------------------------------
//  Copyright (C) 2008 - All Rights Reserved
// ***************************************************************
// Author: Wang Liuqiang
// E-Mail: wlq_729@163.com
// ***************************************************************
#include <iostream>
#include <vector>
using namespace std;

// 定义矩阵阶数
#define N 4

/************************************************************************/
/*               求取矩阵matrix的第i行第j列的代数余子式矩阵             */
/************************************************************************/
void GetSubMatrix(vector< vector<double> >& matrix, int i, int j)
{
 vector< vector<double> >::iterator it1;
 vector<double>::iterator it2;

 int idx;

 for (idx = 1, it1 = matrix.begin(); idx < i&&it1 != matrix.end(); idx++, it1++)
 {

 }
 if (it1 == matrix.end())
 {
  cout<<"所给参数不合理!"<<endl;
  return;
 }
 else
 {
  matrix.erase(it1);
 }

 for (it1 = matrix.begin(); it1 != matrix.end(); it1++)
 {
  for (idx = 1, it2 = it1->begin(); idx < j&&it2 != it1->end(); idx++, it2++)
  {

  }
  if (it2 == it1->end())
  {
   cout<<"所给参数不合理!"<<endl;
   return;
  }
  else
  {
   it1->erase(it2);
  }
 }
}

/************************************************************************/
/*              求取矩阵行列式,rank为矩阵的阶数                        */
/************************************************************************/
double CalculateDetMatr(vector< vector<double> > matrix, int rank)
{
 double DetValue = 0;
 vector< vector<double> > temp;

 if (rank == 1)
 {
  return matrix[0][0];
 }
 if (rank == 2)
 {
  DetValue = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  return DetValue;
 }
 else
 {
  int coe = 1;
  // 每个矩阵都按第一行展开,所以下面的循环,当i为奇数时,奇数和
  // 1相加为偶数所以系数为1;当i为偶数时,偶数加1为奇数系数为-1;
  for (int i = 1; i <= rank; i++)
  {
   if (i % 2 != 0)
   {
    coe = 1;
   }
   else
   {
    coe = -1;
   }
   temp = matrix;                  
   double temp2 = temp[0][i - 1];   // 保存系数

   // 计算代数余子式矩阵
   GetSubMatrix(temp, 1, i);

   // 将每一步运算的代数余子式矩阵输出
            cout<<"代数余子式为:"<<endl;
   for (int k = 0; k < temp.size(); k++)
   {
    for (int j = 0; j < temp[k].size(); j++)
    {
     cout<<temp[k][j]<<" ";
    }
    cout<<endl;
   }

   DetValue += coe * temp2 * CalculateDetMatr(temp, rank - 1);
  }
  return DetValue;
 }
}

void main()
{
 int i, j, k;
 vector< vector<double> > matrix;
 vector<double> temp;
 double value;
 double Det;

 // 输入矩阵
 for (i = 0; i < N; i++)
 {
  temp.clear();
  for (j =0; j < N; j++)
  {
   cin>>value;
   temp.push_back(value);
  }
  matrix.push_back(temp);
 }
 
 // 输出矩阵
 for (i = 0; i < matrix.size(); i++)
 {
  for (j = 0; j < matrix[i].size(); j++)
  {
   cout<<matrix[i][j]<<" ";
  }
  cout<<endl;
 }

 Det = CalculateDetMatr(matrix, N);
 cout<<"矩阵行列式的值为:"<<endl;
 cout<<Det<<endl;
}