二维矩阵类(MyMatrix)说明文档
一、MyMatrix类的组成
1.1 私有成员
int row 二维矩阵行数
int col 二维矩阵列数
T** data 二维矩阵数据
1.2 共有成员
1.2.1 构造与析构函数
MyMatrix() 默认构造
MyMatrix(const int rc) 方阵构造
MyMatrix(const int m_row, const int n_col) 一般空矩阵构造
MyMatrix(T* Data, const int m_row, const int n_col) 一般非空矩阵构造
MyMatrix(const MyMatrix<T>& rhs) 复制构造
~MyMatrix() 析构函数
1.2.2 运算符重载函数
MyMatrix<T>& operator=(const MyMatrix<T>& rhs) 重载“=”运算符
T* operator[](const int addr) 重载“[]”运算符
MyMatrix operator+(const MyMatrix<T>& rhs2) 重载”+”运算符(矩阵加法)
MyMatrix operator-(const MyMatrix<T>& rhs2) 重载”-”运算符(矩阵减法)
MyMatrix operator*(const MyMatrix<T>& rhs2) 重载”*”运算符(矩阵乘法)
MyMatrix<T> operator+(const T& num) 重载”+”运算符(数值加法)
MyMatrix<T> operator-(const T& num) 重载”-”运算符(数值减法)
MyMatrix<T> operator*(const T& num) 重载”*”运算符(数值乘法)
MyMatrix& operator+=(const MyMatrix<T>& rhs2) 重载”+=”运算符(矩阵加法)
MyMatrix& operator-=(const MyMatrix<T>& rhs2) 重载”-=”运算符(矩阵减法)
MyMatrix& operator*=(const MyMatrix<T>& rhs2) 重载”*=”运算符(矩阵乘法)
MyMatrix<T>& operator+=(const T& num) 重载”+=”运算符(数值加法)
MyMatrix<T>& operator-=(const T& num) 重载”-=”运算符(数值减法)
MyMatrix<T>& operator*=(const T& num) 重载”*=”运算符(数值乘法)
template<typename _T> friend ostream& operator<<(ostream& os, const MyMatrix<_T>& rhs) 重载”<<”运算符
template<typename _T> friend istream& operator>>(istream& is, MyMatrix<_T>& rhs) 重载”>>”运算符
1.2.3 其他成员函数
void setRow(int m_row) 为MyMatrix对象的row成员赋值
void setCol(int n_col) 为MyMatrix对象的col成员赋值
void setShape(int m_row, int n_col) 为MyMatrix对象的row和col成员赋值
void setData(T** Data) 为MyMatrix对象的data成员赋值
int getRow() 返回MyMatrix对象的row成员值
int getCol() 返回MyMatrix对象的col成员值
int* getShape() 返回MyMatrix对象的row和col成员值
T** getData() 返回MyMatrix对象的data成员值
bool isEmpty() 检验MyMatrix对象的data成员是否为空
MyMatrix transpose() 返回MyMatrix对象的转置矩阵
二、MyMatrix类的功能
2.1 接受多种类型的数据构造MyMatrix对象
2.1.1 方阵构造:
传入方阵的维数值rc进行MyMatrix对象构造,对象的data指向大小为rc*rc的空间,该矩阵暂时为空。矩阵可以接受包含int、float、double等元素类型在内的构造,参数接受大于等于0的int型值。
eg:
MyMatrix<int> m1(3);
2.1.2 一般空矩阵构造:
传入矩阵的行数m_row和列数n_col值进行MyMatrix对象构造,对象的data指向大小为m_row*n_col的空间,该矩阵暂时为空。矩阵可以接受包含int、float、double等元素类型在内的构造,参数m_row和n_col接受大于等于0的int型值。
eg:
MyMatrix<double> m2(3, 2);
2.1.3 一般非空矩阵构造:
传入矩阵的数据内容Data,行数m_row和列数n_col值进行MyMatrix对象构造,对象的data指向大小为m_row*n_col的空间,该矩阵存储了传入的Data指针所指向的值。矩阵可以接受包含int、float、double等元素类型在内的构造,参数m_row和n_col接受大于等于0的int型值。
eg:
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<float> m2(float_list, 3, 2);
2.1.4 复制构造:
传入MyMatrix类型的值进行MyMatrix对象复制构造,构造函数中将传入对象的data保存至被构造对象的data中,将传入对象的row和col保存至被构造对象的row和col中。
eg:
MyMatrix<float> m4(m3);
2.2 MyMatrix对象进行多种运算操作
2.2.1 “=”运算
重载”=”运算符,传入MyMatrix类型的值将其传递给等号左边MyMatrix对象的data中,将传入矩阵的维数传递给等号左边MyMatrix对象的row和col中。
eg:
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<float> m2(float_list, 3, 2), m5;
m5 = m2;
2.2.2 “[]”运算
重载”[]”运算符,使用户能沟通过”[]”运算符以二维数组的形式显式地索引MyMatrix对象存储的二维矩阵中的每一个元素。
eg:
cout << m2[0][0] << endl;
2.2.3 矩阵“+”运算
重载”+”运算符,符号两侧传入MyMatrix对象进行加法运算,将运算结果传递给新构造的MyMatrix对象的data中。若加矩阵的维度与被加矩阵的维度不同,则打印Error信息。
eg:
m5 = m5 - m2;
2.2.4 矩阵“-”运算
重载”-”运算符,符号两侧传入MyMatrix对象进行减法运算,将运算结果传递给新构造的MyMatrix对象的data中。若减矩阵的维度与被减矩阵的维度不同,则打印Error信息。
eg:
m5 = m5 + m2;
2.2.5 矩阵“*”运算
重载”*”运算符,符号两侧传入MyMatrix对象进行乘法运算,将运算结果传递给新构造的MyMatrix对象的data中,符号左侧原矩阵的row赋给新的row,符号右侧原矩阵的col赋给新的col。若乘矩阵的行数与被乘矩阵的列数不同,则打印Error信息。
eg:
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<float> m6(float_list, 2, 3), m7(float_list, 3, 2);
m6 = m6 * m7;
2.2.6 数值“+”运算
重载”+”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行加法运算,将运算结果传递给新构造的MyMatrix对象的data中。
eg:
m5 = m5 + 3.0f;
2.2.7 数值“-”运算
重载”-”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行减法运算,将运算结果传递给新构造的MyMatrix对象的data中。
eg:
m5 = m5 - 3.0f;
2.2.8 数值“*”运算
重载”*”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行乘法运算,将运算结果传递给新构造的MyMatrix对象的data中。
eg:
m5 = m5 * 3.0f;
2.2.9 矩阵“+=”运算
重载”+=”运算符,符号两侧传入MyMatrix对象进行加法运算,将运算结果传递给符号左侧的MyMatrix对象的data中。若加矩阵的维度与被加矩阵的维度不同,则打印Error信息。
eg:
m5 += m2;
2.2.10 矩阵“-=”运算
重载”-=”运算符,符号两侧传入MyMatrix对象进行减法运算,将运算结果传递给符号左侧的MyMatrix对象的data中。若减矩阵的维度与被减矩阵的维度不同,则打印Error信息。
eg:
m5 -= m2;
2.2.11 矩阵“*=”运算
重载”*=”运算符,符号两侧传入MyMatrix对象进行乘法运算,将运算结果传递给符号左侧的MyMatrix对象的data中,符号左侧原矩阵的row赋给新的row,符号右侧原矩阵的col赋给新的col。若乘矩阵的行数与被乘矩阵的列数不同,则打印Error信息。
eg:
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<float> m6(float_list, 2, 3), m7(float_list, 3, 2);
m6 *= m7;
2.2.12 数值“+=”运算
重载”+=”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行加法运算,将运算结果传递给符号左侧的MyMatrix对象的data中。
eg:
m5 += 3.0f;
2.2.13 数值“-=”运算
重载”-=”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行加法运算,将运算结果传递给符号左侧的MyMatrix对象的data中。
eg:
m5 -= 3.0f;
2.2.14 数值“*=”运算
重载”*=”运算符,符号左侧传入MyMatrix对象,右侧传入与MyMatrix对象中的data数据类型匹配的常数值进行乘法运算,将运算结果传递给符号左侧的MyMatrix对象的data中。
eg:
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<float> m6(float_list, 2, 3);
m6 *= 3.0f;
2.2.15 “>>”运算
重载”>>”运算符,将由键盘输入的字符串传递给一个MyMatrix对象的data中。
eg:
cin >> m1;
2.2.16 “<<”运算
重载”<<”运算符,将一个MyMatrix对象的data数据内容打印出来。
eg:
cout << m1 << endl;
2.3 MyMatrix对象进行转置等操作
2.3.1 矩阵转置
提供transpose()方法,该方法能够返回该MyString对象的data中所存储的二维矩阵的转置矩阵。目前可对矩阵进行的特殊转换操作仅支持转置方法,后续还将开发矩阵的LUP求逆方法。
eg:
m6.transpose();
三、MyMatrix类的使用
3.1 使用说明
MyMatrix类的测试代码以x86版本进行编译,用户使用时请参照前两节的内容创建您自己的对象并调用相应的方法实现您所需的功能。MyMatrix类提供的接口支持包括int、float、double、MyMatrix等多种类型参数的操作。MyMatrix类提供了setRow()、setCol()、setShape()和setData()的方法供用户在特殊情况下直接对对象的存储内容进行修改,但是此行为不被提倡,容易造成对象的data成员和row、col成员不匹配的情况。
MyMatrix类目前提供源文件的.h文件供用户使用,下一步将在https://github.com/TJHDL/MyMatrix2021进行开源,该项目遵循MIT协议,欢迎用户通过实践提出宝贵的意见和建议,以激励本项目继续进行bug的修复和改进。
3.2 使用示例
本节提供对MyMatrix类进行测试的main.cpp程序作为使用示例,所涉及的操作情况并不完全,用户可基于该程序进行自己的开发,并且对MyMatrix类尝试更加丰富的操作。
main.cpp:
#include <iostream>
#include <MyMatrix.h>
using namespace std;
int main()
{
int m = 3, n = 2;
int int_list[6] = { 1,2,3,4,5,6 };
float float_list[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
MyMatrix<int> temp, temp0(int_list, m, n);
MyMatrix<double> temp1(m, n);
MyMatrix<float> temp2(float_list, m, n);
MyMatrix<float> temp3(temp2);
MyMatrix<float> temp4(m, n);
temp = temp0;
cout << "'temp' is:\n" << temp << endl;
temp4 = temp2;
cout << "'temp4' is:\n" << temp4 << endl;
temp4 = temp4 + temp2;
cout << "'temp4' is:\n" << temp4 << endl;
temp = temp * 3;
cout << "'temp' is:\n" << temp << endl;
temp4 += 0.1f;
cout << "'temp4' is:\n" << temp4 << endl;
temp4 -= 0.2f;
cout << "'temp4' is:\n" << temp4 << endl;
temp.transpose();
cout << "'temp' is:\n" << temp << endl;
cout << "The value in (0,0) position of 'temp' is:\n" << temp[0][0] << endl;
return 0;
}
示例结果:
3.3 警告、报错说明
本节将对用户使用过程中遇到的各种警告或报错情况进行说明,警告和报错的存在旨在提醒您如何安全、正确得使用MyMatrix类。
Warning:
case1: 用户企图手动修改MyMatrix对象。
Warning: It is an irregular method!
Error:
case1: 用户企图设定的二维矩阵行数小于0。
Error: The parameter m_row is an invalid value!
case2: 用户企图设定的二维矩阵列数小于0。
Error: The parameter n_col is an invalid value!
case3: 用户企图设定的二维方阵的维数小于0。
Error: The parameter rc is an invalid value!
case4: 用户传递给复制构造参数的MyMatrix对象为不合法的矩阵。
Error: The parameter rhs is an invalid matrix!
case5: 用户使用”[]”运算符时索引越界。
Error: The parameter addr is invalid!
case6: 用户对MyMatrix对象执行加减法操作时,两个矩阵行数不匹配。
Error: The matrix1's row dimension isn't matched with the matrix2's!
case7: 用户对MyMatrix对象执行加减法操作时,两个矩阵行数不匹配。
Error: The matrix1's col dimension isn't matched with the matrix2's!
case8: 用户对MyMatrix对象执行加乘法操作时,两个矩阵中存在维数小于等于0的矩阵。
Error: Matrix's dimension is invalid!
case9: 用户对MyMatrix对象执行加乘法操作时,前一个矩阵的列数与后一个矩阵的行数不匹配。
Error: During multiplication, the dimensions of two matrixes isn't matching!
3.4 指定样例测试结果
本节以题目提供的测试程序对MyMatrix类进行测试,并展示对应的测试结果。
main.cpp:
#include <iostream>
#include <MyMatrix.h>
using namespace std;
int main()
{
int buffer[6] = { 1,2,3,4,5,6 };
int m = 2, n = 3;
MyMatrix<int> temp;
MyMatrix<double> temp1(m, n);//构造m*n的空矩阵
MyMatrix<int> temp2(buffer, m, n);//把buffer转换成m*n矩阵
MyMatrix<int> temp3(temp2);
MyMatrix<int> temp4;
temp3 = temp2;//所有元素都要拷贝过去
temp = temp2 + temp3;//同样大小的矩阵
temp2 = temp * 3;//每个元素乘以3
temp2 = temp - 3;//每个元素加3
cout << temp << endl;//输出temp格式到屏幕
cout << temp2 << endl;
cout << temp3 << endl;
return 0;
}
测试结果:
以下展示部分代码,完整工程代码见github:GitHub - TJHDL/MyMatrix2021
#pragma once
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
template<typename T>
class MyMatrix {
private:
int row;
int col;
T** data;
public:
// Constructors and destructors.
MyMatrix();
MyMatrix(const int rc); // Square matrix.
MyMatrix(const int m_row, const int n_col);
MyMatrix(T* Data, const int m_row, const int n_col);
MyMatrix(const MyMatrix<T>& rhs);
~MyMatrix();
// Operators overloading.
MyMatrix<T>& operator=(const MyMatrix<T>& rhs);
T* operator[](const int addr);
MyMatrix operator+(const MyMatrix<T>& rhs2);
MyMatrix operator-(const MyMatrix<T>& rhs2);
MyMatrix operator*(const MyMatrix<T>& rhs2);
MyMatrix<T> operator+(const T& num);
MyMatrix<T> operator-(const T& num);
MyMatrix<T> operator*(const T& num);
MyMatrix& operator+=(const MyMatrix<T>& rhs2);
MyMatrix& operator-=(const MyMatrix<T>& rhs2);
MyMatrix& operator*=(const MyMatrix<T>& rhs2);
MyMatrix<T>& operator+=(const T& num);
MyMatrix<T>& operator-=(const T& num);
MyMatrix<T>& operator*=(const T& num);
template<typename _T> friend ostream& operator<<(ostream& os, const MyMatrix<_T>& rhs);
template<typename _T> friend istream& operator>>(istream& is, MyMatrix<_T>& rhs);
// Other member functions.
void setRow(int m_row);
void setCol(int n_col);
void setShape(int m_row, int n_col);
void setData(T** Data);
int getRow();
int getCol();
int* getShape();
T** getData();
bool isEmpty();
MyMatrix transpose();
};