這兩天圖形學的實驗對三維圖形進行放縮平移投影,裡面需要用到一些矩陣的運算,于是需要動手寫一個矩陣運算的類CMatrix(MFC中進行開發是以第一個字母是C)。
最好做的和普通的數字預算一樣簡單。
由于在MFC程式中圖形變化是不斷進行的,需要大量矩陣預算,并且程序會一直保持運作狀态,是以矩陣預算要進行手動記憶體釋放,并且不要進行無用操做
例如a+b,a*b之類的操作,因為這些運算都會在堆上生成一個額外的對象,正确的操作應該是c=a+b,并且在必要的時候将c釋放掉
可以直接輸入輸出矩陣例如cout<<a,cin>>b,直接通路矩陣r行c列上的值例如a[r][c],常用的運算符都進行了重載例如自增自減;
沒有實作矩陣的除法github位址https://github.com/Easoncheng0405/CMatrix/
頭檔案 CMatrix.h:
#pragma once
#include <iostream>
using namespace std;
class CMatrix
{
private:
int** arr;
int row, column;
public:
CMatrix(); //預設構造函數
CMatrix(int n); //n行n列
CMatrix(int n, int m); //n行m列
CMatrix(const CMatrix& matrix);//拷貝構造函數
~CMatrix(); //析構函數
CMatrix& operator +(const CMatrix& matrix); //矩陣之間的加法運算
CMatrix& operator +=(const CMatrix& matrix); //矩陣之間自加運算
CMatrix& operator -(const CMatrix& matrix); //矩陣之間的減法運算
CMatrix& operator -=(const CMatrix& matrix); //矩陣之間自減運算
CMatrix& operator *(const CMatrix& matrix); //矩陣間的乘法運算
CMatrix& operator *(int v); //矩陣與整數的預算
CMatrix& operator *=(const CMatrix& matrix); //矩陣之間的自乘運算
CMatrix& operator *=(int v); //矩陣與整數的自乘運算
CMatrix& operator /=(int v); //矩陣與整數的自除運算
CMatrix& operator /(int v);
CMatrix& operator =(const CMatrix& matrix); //矩陣的指派
bool operator ==(const CMatrix& matrix); //判斷兩個矩陣是否相等
inline int* operator [](int index) //重載[]運算符獲得與二維數組同樣的操作效果
{ return arr[index]; }
//重載輸入輸出
friend ostream & operator<<(ostream &out, CMatrix &obj);
friend istream & operator >> (istream &in, CMatrix &matrix);
void setRow(int row, int v); //将第row行指派v
void setColumn(int column, int v); //将第column列指派v
void setAll(int v); //将矩陣全部指派為v
inline int** getArr() { return arr; } //擷取二維數組頭指針
CMatrix& turn(); //轉置矩陣
void freeArr(int** arr,int r);
};
源檔案
#include "stdafx.h"
#include "CMatrix.h"
CMatrix::CMatrix()
{
row = column = 0;
arr = nullptr;
}
CMatrix::CMatrix(const CMatrix & matrix)
{
freeArr(arr, row);
row = matrix.row, column = matrix.column;
arr = new int*[row];
for (int i = 0; i < row; i++)
arr[i] = new int[column]();
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] = matrix.arr[i][j];
}
CMatrix::CMatrix(int n)
{
row = column = n;
arr = new int*[row];
for (int i = 0; i < row; i++)
arr[i] = new int[column]();
}
CMatrix::CMatrix(int n, int m)
{
row = n, column = m;
arr = new int*[row];
for (int i = 0; i < row; i++)
arr[i] = new int[column]();
}
CMatrix::~CMatrix()
{
freeArr(arr, row);
}
CMatrix & CMatrix::operator+(const CMatrix & matrix)
{
CMatrix* tmp=new CMatrix(matrix.row, matrix.column);
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
tmp->arr[i][j] = arr[i][j] + matrix.arr[i][j];
return *tmp;
}
CMatrix & CMatrix::operator-(const CMatrix & matrix)
{
CMatrix* tmp=new CMatrix(matrix.row, matrix.column);
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
tmp->arr[i][j] = arr[i][j] - matrix.arr[i][j];
return *tmp;
}
CMatrix & CMatrix::operator*(const CMatrix & matrix)
{
CMatrix* tmp = new CMatrix(row,matrix.column);
for (int i = 0; i < row; i++)
for (int j = 0; j < matrix.column; j++)
for (int k = 0; k < column; k++)
tmp->arr[i][j] = tmp->arr[i][j] + arr[i][k] * matrix.arr[k][j];
return *tmp;
}
CMatrix & CMatrix::operator*(int v)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] *= v;
return *this;
}
CMatrix & CMatrix::operator/=(int v)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] /= v;
return *this;
}
CMatrix & CMatrix::operator/(int v)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] /= v;
return *this;
}
CMatrix& CMatrix::operator=(const CMatrix & matrix)
{
freeArr(arr, row);
row = matrix.row, column = matrix.column;
arr = new int*[row];
for (int i = 0; i < row; i++)
arr[i] = new int[column];
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] = matrix.arr[i][j];
return *this;
}
CMatrix& CMatrix::operator +=(const CMatrix & matrix)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] += matrix.arr[i][j];
return *this;
}
CMatrix & CMatrix::operator*=(const CMatrix & matrix)
{
int** tmp = new int*[row];
for (int i = 0; i < row; i++)
tmp[i] = new int[matrix.column]();
for (int i = 0; i < row; i++)
for (int j = 0; j < matrix.column; j++)
for (int k = 0; k < column; k++)
tmp[i][j] += arr[i][k] * matrix.arr[k][j];
freeArr(arr, row);
this->arr = tmp;
column = matrix.column;
return *this;
}
CMatrix& CMatrix::operator -=(const CMatrix & matrix)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] -= matrix.arr[i][j];
return *this;
}
CMatrix& CMatrix::operator*=(int v)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] *= v;
return *this;
}
bool CMatrix::operator==(const CMatrix & matrix)
{
if (row != matrix.row || column != matrix.column)
return false;
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
if (arr[i][j] != matrix.arr[i][j])
return false;
return true;
}
void CMatrix::setRow(int row, int v)
{
if (row<0 || row>this->row)
return;
for (int i = 0; i < row; i++)
arr[row][i] = v;
}
void CMatrix::setColumn(int column, int v)
{
if (column<0 || column>this->column)
return;
for (int i = 0; i < column; i++)
arr[i][column] = v;
}
void CMatrix::setAll(int v)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
arr[i][j] = v;
}
CMatrix & CMatrix::turn()
{
int **tmp = new int*[column];
for (int i = 0; i < column; i++)
tmp[i] = new int[row]();
for (int i = 0; i < column; i++)
for (int j = 0; j < row; j++)
tmp[i][j] = arr[j][i];
freeArr(arr, row);
swap(row, column);
this->arr = tmp;
return *this;
}
ostream & operator<<(ostream & out, CMatrix & matrix)
{
for (int i = 0; i < matrix.row; i++)
{
for (int j = 0; j < matrix.column; j++)
out << matrix.arr[i][j] << " ";
out << endl;
}
return out;
}
istream & operator>>(istream & in, CMatrix & matrix)
{
for (int i = 0; i < matrix.row; i++)
for (int j = 0; j < matrix.column; j++)
in >> matrix.arr[i][j];
return in;
}
void CMatrix::freeArr(int** arr,int r)
{
if (!arr)
return;
for (int i = 0; i < r; i++)
delete[] arr[i];
delete[] arr;
arr = nullptr;
}