天天看點

c++實作矩陣運算

#include <iostream>
#include <iomanip>
#include <ctime>
#include <string.h>
#include <typeinfo>
#include <windows.h>
#include <time.h>
#include <unistd.h>
#include <math.h>
#include <vector> 
#include <algorithm>
#include "mystring.h"
using namespace std;
#define PI 3.14

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Matrix 
{ 
	public: 
		Matrix(void); 
		Matrix(int p[][3]);
		Matrix(Matrix &matrix);
		Matrix & operator =(const Matrix &matrix)
		{
			cout << this << "執行 = 函數:" << endl;
			cout << "從這裡指派:" << &matrix << endl;
			if (this == &matrix)
			{
				return *this;
			}
			int i;
			int j;
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					this->data[i][j] = matrix.data[i][j];
				}
			}
			return *this;
		}
		Matrix  operator +(Matrix &matrix)
		{
			Matrix tmp;
			int i;
			int j;
			cout << this << "執行 + 函數:" << endl;
			
			
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					tmp.data[i][j] = this->data[i][j] + matrix.data[i][j];
				}
				
			}
			return tmp;
		}
		Matrix  operator *(Matrix &matrix)
		{
			cout << this << "執行 *函數:" << endl;
			int i;
			int j;
			int k;
			Matrix tmp;
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					for (k = 0; k < 3; k++)
					{
						tmp.data[i][j] += this->data[i][k] * matrix.data[k][i];
					}
				}
			}
			return tmp;
		}
		Matrix & operator +=(Matrix &matrix)
		{
			cout << this << "執行 += 函數:" << endl;
			int i;
			int j;
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					this->data[i][j] += matrix.data[i][j];
				}
			}
			return *this;
		}
		Matrix & operator *=(Matrix &matrix)
		{
			cout << this << "執行 *= 函數:" << endl; 
			int i;
			int j;
			int k;
			Matrix tmp;
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					for (k = 0; k < 3; k++)
					{
						tmp.data[i][j] += this->data[i][k] * matrix.data[k][i];
					}
				}
			}
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					this->data[i][j] = tmp.data[i][j];
				}
			}
			return *this;
		}
		void dis()
		{
			cout << this <<  "執行 dis() 函數: " << endl;
			int i;
			int j;
			for (i = 0; i < 3; i++)
			{
				for (j = 0; j < 3; j++)
				{
					cout << this->data[i][j] << "  ";
				}
				cout << endl << endl;
			}
			cout << endl;
		}
		~Matrix()
		{
			cout << "destructor" << this << endl;
		}
	private: 
		int data[3][3]; 
};

Matrix::Matrix(void)
{
	cout << "無參構造:" << this << endl; 
	int i;
	int j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			data[i][j] = 0;
		}
	}
}

Matrix::Matrix(int p[][3])
{
	cout << "數組參數構造;" << this << endl;
	int i;
	int j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			data[i][j] = p[i][j];
		}
	}
}

Matrix::Matrix(Matrix &matrix)
{
	cout << "拷貝構造:" << this << endl;
	int i;
	int j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			this->data[i][j] = matrix.data[i][j];
		}
	}
}

int main(int argc, char** argv) 
{
	// 測試無參構造函數 
	Matrix mat1;
	cout << "mat1.dis()" << endl;
	mat1.dis();
	
	// 測試參數為二維數組的構造函數 
	int data[3][3] = {
					  1, 1, 1, 
					  1, 1, 1, 
					  1, 1, 1
					 };
	Matrix mat2(data);
	cout << "mat2.dis()" << endl;
	mat2.dis();
	
	// 測試拷貝構造函數 
    Matrix mat3(mat2);
    cout << "mat3.dis()" << endl;
    mat3.dis();
    
    // 測試指派函數
	Matrix mat4;
	cout << "mat4.dis()" << endl;
	mat4.dis();
	mat4 = mat3;
	cout << "mat4.dis()" << endl; 
	mat4.dis();
	
	// 測試 "+" 運算符
	Matrix mat5;
	cout << "mat4 + mat3" << endl;
	mat5 = mat4 + mat3;
	cout << "mat5.dis()" << endl;
	mat5.dis(); 
	
	// 測試 "*" 運算符
	Matrix mat6;
	cout << "mat6 = mat4 * mat5";
	mat6 = mat4 * mat5;
	cout << "mat6.dis()" << endl; 
	mat6.dis();
	cout << "Hello world" << endl;
	
	// 測試 "*=" 運算符
	cout << "mat6 *= mat5" << endl;
	mat6 *= mat5;
	cout << "mat5.dis()" << endl;
    mat5.dis();
	cout << "mat6.dis()" << endl;
	mat6.dis();
	
	// 測試 "+=" 運算符
	cout << "mat4.dis()" << endl;
	mat4.dis();
	mat5 += mat4;
	cout << "mat5.dis()" << endl;
	mat5.dis();
	
	return 0;
}
           
c++

繼續閱讀