1、输于两个n×n的矩阵A和B,实现乘积运算,并输出运算结果和计算时间; 2、逐渐增大矩阵A和B的规模,分析运算时间的变化。 3、用分治法的实现矩阵乘积运算,比较使用分治法前后的计算量差异。用C++完成
时间: 2024-11-03 20:23:16 浏览: 26
为了实现矩阵乘法并输出结果以及计算时间,你可以使用C++编写一个简单的程序。首先,我们需要导入必要的库来处理高精度计算和计时功能。下面是一个基础的C++实现,包括矩阵乘法的计算、时间和空间复杂度分析:
```cpp
#include <iostream>
#include <chrono>
#include <vector>
// 矩阵乘法函数
std::vector<std::vector<int>> matrixMultiply(const std::vector<std::vector<int>>& A, const std::vector<std::vector<int>>& B) {
int m = A.size(), n = A[0].size(), p = B[0].size();
if (n != p) {
throw std::invalid_argument("Matrix dimensions not compatible for multiplication");
}
std::vector<std::vector<int>> result(m, std::vector<int>(p, 0));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < p; ++j) {
for (int k = 0; k < n; ++k) {
result[i][j] += A[i][k] * B[k][j];
}
}
}
return result;
}
// 计算并打印结果和运行时间
void calculateAndPrint(const std::vector<std::vector<int>>& A, const std::vector<std::vector<int>>& B) {
auto start = std::chrono::high_resolution_clock::now();
std::vector<std::vector<int>> product = matrixMultiply(A, B);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Matrix product:\n" << product << "\nTime taken: " << duration << " microseconds" << std::endl;
}
int main() {
// 示例小规模矩阵
std::vector<std::vector<int>> A(2, std::vector<int>({1, 2}, {3, 4}));
std::vector<std::vector<int>> B(2, std::vector<int>({5, 6}, {7, 8}));
calculateAndPrint(A, B);
// 扩大矩阵规模并记录时间
for (int size = 4; size <= 10; size *= 2) {
A.resize(size, std::vector<int>(size, 0));
B.resize(size, std::vector<int>(size, 0));
// 增加随机元素使得每次测试矩阵不同
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
A[i][j] = rand() % 100;
B[i][j] = rand() % 100;
}
}
calculateAndPrint(A, B);
std::cout << "\n---\n";
}
return 0;
}
```
在这个示例中,我们首先定义了`matrixMultiply`函数用于矩阵乘法,然后通过`calculateAndPrint`函数来计算乘积并测量时间。在`main`函数中,我们将矩阵大小从一个小规模开始逐渐增大。
关于分治法实现矩阵乘法,常规算法已经是非常高效的,但如果要用分治法优化,通常是指将大矩阵分解成更小的部分进行递归计算,这在实际应用中并不常见,因为标准的行列乘法(Strassen's algorithm 或者类似方法)在大多数场景下效率更高。然而,如果你想要研究这个话题,可以尝试对比分治法(如Strassen算法)和直接乘法在不同规模下的性能差异。在本示例中,由于篇幅限制,我没有加入分治法的实现,但实际上你可以添加一个额外的分支,比如`strassenMultiply`,并与`matrixMultiply`进行对比。
阅读全文