天天看點

C++ 中矩陣運算的實作

這兩天圖形學的實驗對三維圖形進行放縮平移投影,裡面需要用到一些矩陣的運算,于是需要動手寫一個矩陣運算的類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;

}

繼續閱讀