(1)random库(随机数矩阵):
1.
-
(1)std::random_device
是一个产生非确定性随机数的类。
-
在大多数情况下,它会产生基于硬件的随机数,比如通过硬件噪声等方式。
-
(2)rd
是这个类的一个实例。
-
这一行代码的作用是提供种子(seed)的随机数生成器。
std::random_device rd; // 如果可行,用一个真实的随机值作为种子
2.
-
(1)std::mt19937
是一种基于梅森旋转算法的随机数生成器。
-
这个生成器提供了高质量的伪随机数,并且有非常长的周期(219937−1219937−1个数字之前重复)。
-
(2)gen
是这个类的一个实例。
-
调用种子来生成一个随机数。这意味着每次程序运行时, 都会因为不同的种子而产生不同的随机数序列。
-
std::mt19937 gen(rd());
3.
-
(1)std::uniform_int_distribution<int>
是一个模板类,用于使用 随机数生成器生成特定范围内的均匀分布的数。
-
在这个例子中,它被用于生成范围在 1 到 100 之间的整数。
-
(2)dist
是这个类的一个实例。
namespace algebra { Matrix random(size_t n, size_t m, double min, double max){// 随机种子生成引擎std::random_device rd;// 随机数生成器std::mt19937 gen(rd());// 规定随机数范围std::uniform_real_distribution<double> dis(min, max);Matrix goal(n, std::vector<double>(m));for(size_t line = 0; line < n; line++) {for(size_t row = 0; row < m; row++) {goal[line][row] = dis(gen);}}return goal;}
}
(2)<iomanip> (输出格式show函数):
-
std::setprecision(int n)
-
设置浮点数输出的精度。
-
示例:std::cout << std::setprecision(3) << 3.14159;
-
输出 3.14
。
-
std::setw(int n)
-
设置下一个输出字段的宽度。
-
示例:std::cout << std::setw(10) << 123;
-
输出 123
(前面有7个空格)。
示例:
namespace algebra { void show(const Matrix& matrix) {// 设置输出格式,以显示有 3 位小数的数字std::cout << std::fixed << std::setprecision(3);size_t matrix_line = matrix.size();size_t matrix_row = matrix[0].size();for(size_t line = 0; line < matrix_line; line++) {for(size_t row = 0; row < matrix_row; row++) {// std::setw(8)用于确保每个元素在宽度为8个字符的字段内显示,以便对齐std::cout << matrix[line][row];if (row < matrix_row - 1)std::cout << " ";}std::cout << std::endl;}}
}
(3)
multiply(const Matrix& matrix1, const Matrix& matrix2)
注意:
循环的形式参数i,j,k应该与矩阵长宽值的类型相同均为size_t
(不然可能报错:Segmentation fault(应该是越界的意思))
Matrix multiply(const Matrix& matrix1, const Matrix& matrix2) {size_t matrix1_lines = matrix1.size();size_t matrix1_rows = matrix1[0].size();size_t matrix2_lines = matrix2.size();size_t matrix2_rows = matrix2[0].size();if (matrix1_rows != matrix2_lines) {throw std::invalid_argument("Matrix dimensions are not compatible for multiplication.");}Matrix goal(matrix1_lines, std::vector<double>(matrix2_rows, 0)); for (size_t line = 0; line < matrix1_lines; line++) {for (size_t row = 0; row < matrix2_rows; row++) {for (size_t num = 0; num < matrix1_rows; num++) {goal[line][row] += matrix1[line][num] * matrix2[num][row];}}}return goal;
}