好吧,我也不知道我的方法對不對,啊對了,這次是在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更新