zoukankan      html  css  js  c++  java
  • 使用vector实现矩阵,并计算N阶矩阵的行列式

     // ***************************************************************
    //  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;
    }

  • 相关阅读:
    JavaScript学习总结【5】、JS DOM
    JavaScript学习总结【11】、JS 运动
    JavaScript学习总结【7】、JS RegExp
    JavaScript学习总结【1】、初识JS
    JavaScript学习总结【10】、DOM 事件
    直接选择排序及交换二个数据的实现
    快速排序
    Lucene.net搜索结果排序(单条件和多条件)
    冒泡排序
    直接插入排序的三种实现
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167995.html
Copyright © 2011-2022 走看看