我的Matrix

B.第二版
这个小程序是增强版本。
1。 程序基本说明:在前一个版本基础上进一步实现矩阵与数的乘法,矩阵的乘法,加法(减法忘了实现了,不过可以用*-1再加来做,所
	以。。。),矩阵的复制(操作符=),矩阵的旋转(transposition即绕主轴翻转180度)。
2。 程序思路:在矩阵的操作符重载后我返回矩阵的引用以便进行操作符的cascade,如M*2*4。	
3。 主要函数介绍:
     A. void mul(int source, int dest, double scalor);  
	void mul(int dest, double scalor);
	内部方法第一个是把source行乘以scalor对应相加到dest行的对应项。第二个把dest行的每个元素乘以scalor.
     B. Matrix& operator *(Matrix otherMatrix);  矩阵的乘法,我为了省事,就在局部声明了一个临时矩阵以便记载结果,然后
	再用复制的方法返回矩阵。
4。 不足之处:
	A. 时间比较少,方法写的比较粗糙。
		
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
const int MaxRow = 10;
const int MaxCol = 10;
const double LIMIT = 0.01;
class Matrix
{
private:
	int rowNum;
	int colNum;
	double lst[MaxRow][MaxCol];
	void mul(int source, int dest, double scalor);
	void mul(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);
	Matrix& operator*(double i);
	Matrix& operator *(Matrix otherMatrix);  
	Matrix& operator = (Matrix other);
	Matrix& operator+(Matrix other);
	Matrix& transposition();
	
};
int main()
{
	Matrix M, N;
	M.readFromFile("c:\\nick.txt");
	N = M;
	cout<<"\nthis is M\n";
	M.display();
	M*2;
//	M.echelon(0, false);
	cout<<"\nthis is M*2\n";
	M.display();
	cout<<"\nthis is N\n";
	N.display();
	M*N;
	cout<<"\nthis is M*N\n";
	M.display();
	cout<<"\nthis is rotating of M\n";
	M.transposition();
	M.display();
	cout<<"\n\n"<<"row is:"<<M.row();
	cout<<"\ncol is:"<<M.col()<<endl;
	return 0;
}
Matrix& Matrix::transposition()
{
	double hold;
	int temp;
	for (int r =0; r< rowNum; r++)
	{
		for (int c=0; c< r; c++)
		{
			hold = lst[r][c];
			lst[r][c] = lst[c][r];
			lst[c][r] = hold;
		}
	}
	temp = rowNum;
	rowNum = colNum;
	colNum = temp;
	return (*this);
}
Matrix& Matrix::operator +(Matrix other)
{
	if (rowNum!= other.row() || colNum!= other.col())
	{
		cout<<"\nTwo matrix has different row or col number!\n";
		return (*this);
	}
	else
	{
		for (int r=0; r< rowNum; r++)
		{
			for (int c=0; c< colNum; c++)
			{
				lst[r][c] +=other.items(r, c);
			}
		}
		return (*this);
	}
}
Matrix& Matrix::operator *(Matrix other)
{
	double total =0;
	Matrix temp;
	temp.setRow(rowNum);
	temp.setCol(other.col());
	if (colNum!=other.row())
	{
		cout<<"\nrow & col are not same!\n";
	
	}
	else
	{
		for (int r =0; r< rowNum; r++)
		{
			for (int c=0; c<other.col(); c++)
			{
				total =0;
				for (int i=0; i<colNum; i++)
				{
					total += lst[r][i] * other.items(i, c);
				}
				temp.items(r, c) = total;
			}
		}
		*this = temp;
	
	}
	return (*this);
}
				
Matrix& Matrix::operator =(Matrix other)
{
	setRow(other.row());
	setCol(other.col());
	for (int r=0; r< other.row(); r++)
	{
		for (int c=0; c< other.col(); c++)
		{
			lst[r][c] = other.items(r, c);
		}
	}
	
	return (*this);
}
void Matrix::mul(int dest, double scalor)
{
	for (int c=0; c< colNum; c++)
	{
		lst[dest][c] *= scalor;
	}
}
Matrix& Matrix::operator *(double i)
{
	for (int r=0; r<rowNum; r++)
	{
		for (int c=0; c<colNum; c++)
		{
			lst[r][c] *= i;
		}
	}
	return (*this);
}
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, 1/lst[r][c]);   //make it 1 for this row
				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);
	
	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"<<(fabs(lst[r][c])<LIMIT?0:lst[r][c]);			
		}
		cout<<endl;
	}
//	cout.precision(temp);
	cout.flags(preFlag);
}
Matrix::Matrix()
{
	rowNum = 5;
	colNum = 5;
	initialize();
}

                                                         back.gif (341 bytes)       up.gif (335 bytes)         next.gif (337 bytes)

Hosted by www.Geocities.ws

1