天天看点

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;

}

继续阅读