C++大作业(实现矩阵类)


实现一个矩阵类,包含以下功能

一、基本成员
(1)rows_行、cols_列、double** mat、矩阵元素
(2)get_rows() 返回行数;get_cols() 返回列数

二、矩阵类的构造函数
(1)默认构造函数,生成一个1,1列的矩阵(Matrix mat;)
(2)生成行列分别为rows, cols的矩阵M(atrix mat(rows, cols); )
(3)生成行列分别为rows, cols,初始值为init_value的矩阵(Matrix mat(rows, cols, init_value); )

一般构造函数

(4)利用初始化列表生成矩阵
Matrix mat = {{1,2,3,4}, {5,6,7,8}};

使用#include <initializer_list>头文件
dev可能用不了
Matrix<T>(initializer_list< initializer_list<T>> list) {
		
}

三、析构函数

delete:用来释放new分配的单个对象指针指向的内存,
delete[]:用来释放new分配的对象数组指针指向的内存。

四、拷贝构造函数与赋值运算符函数(实现深拷贝)

如果类中含有指针类型的数据,浅拷贝就会产生错误。
需要使用深拷贝
深拷贝会拷贝间接内存数据,调用成员对象的构造器。

五、实现基本运算符重载函数,其中表示矩阵,k表示标量(一个实数)。

  • 矩阵类基本运算符
操作符说明
A + k矩阵对应元素加上标量
k + A标量加上矩阵对应元素
A - k矩阵对应元素减去标量
A ∗ k矩阵对应元素乘以标量
k ∗ A标量乘以矩阵对应元素
A + B矩阵对应元素加法
A - B矩阵对应元素减法
A * B矩阵乘法
A % B矩阵对应元素乘法
A / B矩阵对应元素乘法
A ^ k矩阵的次幂[ 可以采用矩阵快速幂实现]
一般重载函数
样例:
返回类型 operator运算符(参数表){
	函数体
}

六、静态函数生成基本矩阵
(1)零矩阵 Matrix::zeros(rows, cols);

(2)单位矩阵 Matrix::eye(size);

(1)(2)简单构造矩阵

(3)均匀分布随机矩阵[ 矩阵元素是均匀分布的随机数(参考附录)] Matrix::randu(rows, cols);

(4)高斯分布随机矩阵[ 矩阵元素是高斯分布的随机数] Matrix::randn(rows, cols);

根据附录表可得

七、应用于方程组的矩阵函数
(1)增广矩阵 Matrix Ab = AugmentMatrix(A, B);

直接拼接
行数相同

(2)逆矩阵 Matrix IA = Inverse(A);

高斯消元法实现

(3)实现高斯消元法求解线性方程组 Matrix x = GaussianElimination(A, b);

注意是否有解的判定

八、高斯滤波
(1)生成高斯核 Matrix H = GaussianKernel(k, sigma); 其中k表示高斯核尺寸, sigma表示方差。

(2)实现高斯滤波 Matrix B = GaussianFilter(A, H),其中H为高斯滤波核矩阵。
高斯滤波及高斯卷积核C++实现

九、实现成员函数实现将矩阵读写函数。比如
Matrix mat;
mat.Load(filename);

mat.Write(filename);

使用#include <fstream>头文件
可以利用vector等方式实现读取的暂存
若有报错认定为不安全再程序中加入
#pragma warning(disable:4996)

附录

一、随机数的生成

通常,C和C++产生随机数都依赖与简单的C库函数rand(),rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。rand()返回随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化随机种子。但是rand()函数存在问题是只能生成均匀分布的整数,如果需要其他随机分布的整数或者浮点数,需要额外处理。
为了解决这个问题,新的C++库引入随机数库,定义在头文件中,主要通过生成器Generators和分布器Distributions对象来生成随机数,其中:
Generators:生成均匀分布的数字序列。
Distributions:将由Generators生成的数字序列转换为符合特定随机分布的数字序列,如均匀分布、正态分布或二项分布。
标准库中提供了三种常用的生成器引擎模板:linear_congruential_engine,mersenne_twister_engine和subtract_with_carry_engine。第一种是线性同余算法,第二种是梅森旋转算法,第三种带进位的线性同余算法。一般的应用的可以采用下表提供的常用的Generators实例类。

  • 表2 生成器Generators实例类
default_random_engine默认生成器
minstd_randMinimal Standard minstd_rand generator
minstd_rand0Minimal Standard minstd_rand0 generator
mt19937Mersenne Twister 19937 generator
mt19937_64Mersenne Twister 19937 generator (64 bit)
ranlux24_baseRanlux 24 base generator
ranlux48_baseRanlux 48 base generator
ranlux24Ranlux 24 generator
ranlux48Ranlux 48 generator
knuth_bKnuth-B generator

具体内容参考


版权声明:本文为weixin_51671868原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。