我的Matrix
A.第一版
这个小程序是最初的版本。
1。 程序基本说明:这是一个实现矩阵各种运算的类,目前仅仅实现了从文件读取矩阵,将矩阵化简为echelon form和reduced echelon
form.
2。 程序思路:我的类功能还很简单,通过一个内置的二维数组记录矩阵的entry。
3。 主要函数介绍:
A. void readFromFile(const char* fileName);从文件读取矩阵,以换行符作为矩阵行数增加的标志,我利用了ifstream的
成员函数peek()每次去偷窥一下是否为换行符,是的话就将矩阵行数加一,同时将列数更新,当然最后一行会因为文件结束而只能强
行加一。
B. void echelon(int r, bool reduced=true);化简为echelon form的函数,首先从0行调用,找到不为0的entry然后将其化简
为1,然后将行数参数r加1,以递归调用。参数reduced默认化简为最简echelon form.
4。 不足之处:
A. 时间比较少,方法写的比较粗糙。
B. 还没有实现矩阵的加碱法,乘法。
#include <iostream> #include <fstream>
using namespace std;
const MaxRow = 10; const MaxCol = 10;
class Matrix { private: int rowNum; int colNum; double lst[MaxRow][MaxCol]; void mul(int source, int dest, double scalor);
public: Matrix(); int row() const {return rowNum;} int col() const {return colNum;} void setRow(const int newRow) { rowNum = newRow;} void setCol(const int newCol) { colNum = newCol;} void display(); double& items(int r, int c); void initialize(); void readFromFile(const char* fileName); void echelon(int r, bool reduced=true); };
int main() { Matrix M; M.readFromFile("c:\\nick.txt"); M.echelon(0); M.display();
cout<<"\n\n"<<"row is:"<<M.row(); cout<<"\ncol is:"<<M.col()<<endl; return 0; }
void Matrix::echelon(int r, bool reduced) { int c=r; if (r<rowNum) { while (c< colNum) { if (lst[r][c] ==0) { c++; } else { mul(r, r, (1-lst[r][c])/lst[r][c]); for (int i=(!reduced?r+1:0); i< rowNum; i++) { if (i!=r) { mul(r, i, -lst[i][c]); } } echelon(r+1, reduced); break; } } }
}
void Matrix::mul(int source, int dest, double scalor) { for (int c=0; c< colNum; c++) { lst[dest][c] += lst[source][c]*scalor; } }
double& Matrix::items(int r, int c) { return lst[r][c]; }
void Matrix::readFromFile(const char* fileName) { int r=0, c=0; char ch; ifstream f; f.open(fileName); while (!f.eof()) { ch = f.peek();
if (ch!=10) {
f>>lst[r][c]; c++; if (c>colNum) colNum = c; } else { f.ignore(); r++; setCol(c); c =0; } } if (r!=0) { setRow(r+1); } }
void Matrix::initialize() { for (int r=0; r < rowNum; r++) { for (int c=0; c< colNum; c++) { lst[r][c] = r*2+c; } } }
void Matrix::display() { int temp; long preFlag; preFlag = cout.flags(); temp = cout.precision(4); // cout.setf(ios::fixed|ios::showpoint);
cout<<"row\\col"; for (int c=0; c< colNum; c++) { cout<<"\t"<<c; } cout<<"\n\n"; for (int r = 0; r< rowNum; r++) { cout<<r; for (c = 0; c< colNum; c++) { cout<<"\t"<<lst[r][c]; } cout<<endl; } cout.precision(temp); cout.flags(preFlag); }
Matrix::Matrix() { rowNum = 5; colNum = 5; initialize(); }