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

具体内容参考

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的 C++ 矩阵实现矩阵相乘的示例代码: ```c++ #include <iostream> #include <vector> using namespace std; class Matrix { private: vector<vector<int>> data; // 存储矩阵的二维向量 int m, n; // 矩阵的行数和列数 public: // 构造函数 Matrix(int rows, int cols) { m = rows; n = cols; data.resize(m, vector<int>(n, 0)); // 初始化矩阵为全零矩阵 } // 矩阵相乘运算符重载 Matrix operator*(const Matrix& other) { if (n != other.m) { cout << "矩阵维度不匹配,无法相乘" << endl; return Matrix(0, 0); } Matrix result(m, other.n); for (int i = 0; i < m; i++) { for (int j = 0; j < other.n; j++) { int temp = 0; for (int k = 0; k < n; k++) { temp += data[i][k] * other.data[k][j]; } result.data[i][j] = temp; } } return result; } // 矩阵赋值运算符重载 Matrix& operator=(const Matrix& other) { if (this == &other) { return *this; } m = other.m; n = other.n; data = other.data; return *this; } // 打印矩阵 void print() { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << data[i][j] << " "; } cout << endl; } } }; int main() { Matrix A(2, 3); Matrix B(3, 2); A.print(); B.print(); A = {{1, 2, 3}, {4, 5, 6}}; B = {{7, 8}, {9, 10}, {11, 12}}; A.print(); B.print(); Matrix C = A * B; C.print(); return 0; } ``` 这个示例代码中,我们定义了一个 `Matrix` 类来表示矩阵,并实现矩阵相乘的运算符重载。在 `main()` 函数中,我们创建了两个矩阵 `A` 和 `B`,并将它们赋值为我们需要相乘的矩阵。然后,我们通过 `A * B` 的方式来计算它们的乘积,并将结果存储在 `C` 中。最后,我们打印了 `C` 的值,即矩阵相乘的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值