好吧,我也不知道我的方法對不對,啊對了,這次是在20分鐘內解決的xd。
使用高斯消去法。
輸入
0 2 4 6 8 0 2 4
2 3 4 7 6 1 -1 2
4 2 3 0 2 -2 2 4
6 -2 -3 0 2 -3 3 7
輸出
0 2 0 0 -7.28 3.6 -7.8 -8.92
2 0 0 0 0.8 -1 1 2.2
0 0 3 0 7.68 -3.6 7.8 8.52
0 0 0 16.6667 14 3.33333 -1.66667 4.33333
程式碼如下

#include <vector>
#include <algorithm>
#include <iostream>
#include <iomanip>

template<typename T>
class DWMatrix
{
public:
 std::vector< std::vector<T> > m_data;
 void addRow(const std::vector<T>& tvector)
 {
  m_data.push_back(tvector);
 }
 template<typename Iter>
 void addRow(Iter beg, Iter end)
 {
  m_data.resize(m_data.size()+1);
  int lastIndex = m_data.size()-1;
  for (Iter it = beg;it!=end;it++)
   m_data[lastIndex].push_back(*it);
 }
 // true is independent
 bool LinearlyIndependent()
 {
  std::vector<bool> isIndependentVector(m_data.size(),false);
  std::vector<bool>::iterator y_no_indep;
  int x_index = 0;
  while ((y_no_indep=std::find(isIndependentVector.begin(),isIndependentVector.end(),false))
   != isIndependentVector.end())
  {
   int find_index = y_no_indep-isIndependentVector.begin();
   for (unsigned int y_index = find_index;y_index<m_data.size();y_index++) // 找到第一個非0項
   {
    if (m_data[y_index][x_index]!=0 && isIndependentVector[y_index]==false)
    {
     Independent(y_index,x_index);
     isIndependentVector[y_index] = true;
     break;
    }
   }
   x_index++;
   if (x_index == m_data[0].size())
    return false;
  }
  return true;
 }
 std::vector<T>& operator[](int index)
 {
  return m_data[index];
 }
 friend std::ostream& operator<<(std::ostream& ostr, const DWMatrix<T>& matrix)
 {
  ostr << std::endl;
  for (unsigned int i=0;i<matrix.m_data.size();i++)
  {
   for (unsigned int j=0;j<matrix.m_data[0].size();j++)
   {
    ostr << std::setw(7) << matrix.m_data[i][j] << " ";
   }
   ostr << std::endl;
  }
  return ostr;
 }

 void Independent( unsigned int y_index, int x_index )
 {
  T data = m_data[y_index][x_index];
  for (unsigned int j=0;j<m_data[y_index].size();j++)
  {
   m_data[y_index][j] /= data;
  }
  for (unsigned int y=0;y<m_data.size();y++)
  {
   if (y != y_index)
   {
    T dot = m_data[y][x_index] / m_data[y_index][x_index];
    for (unsigned int x=0;x<m_data[y_index].size();x++)
    {
     m_data[y][x] -= m_data[y_index][x]*dot;
    }
   }
  }
 }


};

主程式

#include "DWMatrix.h"
#include <iostream>
#include <cstdlib>

int main()
{
    double r1[8] = {0,2,4,6,8,0,2,4};
    double r2[8] = {2,3,4,7,6,1,-1,2};
    double r3[8] = {4,2,3,0,2,-2,2,4};
    double r4[8] = {6,-2,-3,0,2,-3,3,7};
    DWMatrix<double> matrix;
    matrix.addRow(r1,r1+8);
    matrix.addRow(r2,r2+8);
    matrix.addRow(r3,r3+8);
    matrix.addRow(r4,r4+8);
    std::cout << matrix;
    matrix.LinearlyIndependent();
    std::cout << matrix;
    system("pause");
}
11/9更新

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 讓地獄深紅的天亮 的頭像
    讓地獄深紅的天亮

    !壞人必需做好事!

    讓地獄深紅的天亮 發表在 痞客邦 留言(0) 人氣()