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模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167995.html
Copyright © 2011-2022 走看看