当前位置: 首页 > news >正文

使用c++进行大规模的矩阵运算

算法通过分块矩阵乘法和多线程并行计算实现了大规模矩阵乘法的高效计算

#include <iostream>
#include <vector>
#include <thread>
#include <cmath>class LargeMatrixMultiplier {
private:const int BLOCK_SIZE = 64;  // 分块大小// 辅助函数:小规模矩阵乘法void multiplyBlock(const std::vector<std::vector<double>>& A,  // A矩阵const std::vector<std::vector<double>>& B,  // B矩阵std::vector<std::vector<double>>& C,        // C矩阵int rowA, int colA, int colB) const {       // 起始行和列for (int i = 0; i < BLOCK_SIZE; ++i) {                     // 遍历块的行for (int j = 0; j < BLOCK_SIZE; ++j) {                 // 遍历块的列double sum = 0;                                    // 初始化累加器for (int k = 0; k < BLOCK_SIZE; ++k) {             // 遍历块的内部sum += A[rowA + i][colA + k] * B[colA + k][colB + j];  // 累加乘积}C[rowA + i][colB + j] += sum;                      // 更新C矩阵的值}}}// 线程函数void multiplyBlocksThread(const std::vector<std::vector<double>>& A,  // A矩阵const std::vector<std::vector<double>>& B,  // B矩阵std::vector<std::vector<double>>& C,        // C矩阵int startRow, int endRow) const {           // 起始行和结束行int n = A.size();                                                 // 获取矩阵的大小for (int i = startRow; i < endRow; i += BLOCK_SIZE) {             // 遍历行块for (int j = 0; j < n; j += BLOCK_SIZE) {                     // 遍历列块for (int k = 0; k < n; k += BLOCK_SIZE) {                 // 遍历内部块multiplyBlock(A, B, C, i, k, j);                      // 进行块乘法}}}}public:std::vector<std::vector<double>> multiply(const std::vector<std::vector<double>>& A,  // A矩阵const std::vector<std::vector<double>>& B) const {  // B矩阵int n = A.size();                                                             // 获取矩阵的大小std::vector<std::vector<double>> C(n, std::vector<double>(n, 0));             // 初始化C矩阵C.reserve(n);                                                                 // 预留空间int numThreads = std::thread::hardware_concurrency();                         // 获取硬件并发线程数std::vector<std::thread> threads;                                             // 存储线程int rowsPerThread = n / numThreads;                                           // 每个线程处理的行数for (int i = 0; i < numThreads; ++i) {                                        // 创建线程int startRow = i * rowsPerThread;                                         // 计算起始行int endRow = (i == numThreads - 1) ? n : (i + 1) * rowsPerThread;         // 计算结束行threads.emplace_back(&LargeMatrixMultiplier::multiplyBlocksThread, this,  // 创建线程std::ref(A), std::ref(B), std::ref(C), startRow, endRow); // 传递参数}for (auto& thread : threads) {                                                // 等待所有线程完成thread.join();                                                            // 等待线程}return C;                                                                     // 返回结果矩阵}
};int main() {int n = 1024;  // 矩阵大小std::vector<std::vector<double>> A(n, std::vector<double>(n, 1.0));  // 初始化A矩阵std::vector<std::vector<double>> B(n, std::vector<double>(n, 2.0));  // 初始化B矩阵LargeMatrixMultiplier multiplier;                                     // 创建乘法器对象auto C = multiplier.multiply(A, B);                                   // 进行矩阵乘法std::cout << "Matrix multiplication completed." << std::endl;        // 输出完成信息std::cout << "C[0][0] = " << C[0][0] << std::endl;  // 应该是 2048.0  // 输出C矩阵的第一个元素return 0;  // 返回0
}

这只是一个简略的算法,具体需要根据实际情况进行修改

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Debezium日常分享系列之:Debezium 2.7.0.Final发布
  • Qt使用sqlite数据库及项目实战
  • 微信小程序利用第三方库xlsx导出excel
  • Docker-基础
  • LeetCode 30. 串联所有单词的子串
  • 大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】
  • 基于Qt实现的PDF阅读、编辑工具
  • 解决vscode配置C++编译带有中文名称报错问题
  • 网络爬虫基础
  • 电商视角如何理解动态IP与静态IP
  • Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)
  • Portainer 是一个开源的容器管理平台-非常直观好用的Docker图形化项目
  • Python中解决os.listdir命令读取文件乱序问题方法
  • leetcode-21-回溯-全排列及其去重
  • 计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Akka系列(七):Actor持久化之Akka persistence
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Babel配置的不完全指南
  • HTTP中GET与POST的区别 99%的错误认识
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode18.四数之和 JavaScript
  • python 装饰器(一)
  • 爱情 北京女病人
  • 给初学者:JavaScript 中数组操作注意点
  • 关于Java中分层中遇到的一些问题
  • 关于使用markdown的方法(引自CSDN教程)
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端临床手札——文件上传
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 网页视频流m3u8/ts视频下载
  • 怎样选择前端框架
  • 数据库巡检项
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #QT(QCharts绘制曲线)
  • (C++17) optional的使用
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)fiber的基本认识
  • (七)Java对象在Hibernate持久化层的状态
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (推荐)叮当——中文语音对话机器人
  • (学习总结16)C++模版2
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NET 通过系统影子账户实现权限维持
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore发布到IIS
  • .py文件应该怎样打开?
  • @angular/cli项目构建--Dynamic.Form
  • @软考考生,这份软考高分攻略你须知道
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——