文章目录
实现一个矩阵类,包含以下功能
一、基本成员
(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_rand | Minimal Standard minstd_rand generator |
minstd_rand0 | Minimal Standard minstd_rand0 generator |
mt19937 | Mersenne Twister 19937 generator |
mt19937_64 | Mersenne Twister 19937 generator (64 bit) |
ranlux24_base | Ranlux 24 base generator |
ranlux48_base | Ranlux 48 base generator |
ranlux24 | Ranlux 24 generator |
ranlux48 | Ranlux 48 generator |
knuth_b | Knuth-B generator |