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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值