使用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
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue侦听器watch()

侦听器watch&#xff08;&#xff09; 侦听器侦听数据变化&#xff0c;我们可以使用watch 选项在每次响应式属性变化时触发一个函数。 <template><h3>侦听器watch</h3><hr> <p>{{nessage}}</p> <button click"exchage">…

基于YOLOv10+YOLOP+PYQT的可视化系统,实现多类别目标检测+可行驶区域分割+车道线分割【附代码】

文章目录 前言视频效果必要环境一、代码结构1、 训练参数解析2、 核心代码解析1.初始化Detector类2. torch.no_grad()3. 复制输入图像并初始化计数器4. 调用YOLOv10模型进行目标检测5. 提取检测结果信息6. 遍历检测结果并在图像上绘制边界框和标签7. 准备输入图像以适应End-to-…

MySQL使用LIKE索引是否失效的验证

1、简单的示例展示 在MySQL中&#xff0c;LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法&#xff1a; 使用前导通配符&#xff08;%&#xff09;&#xff0c;但确保它紧跟着一个固定的字符。 避免使用后置通配符&#xff08;%&#xff09;&…

【致知功夫 各随分限】成长需要时间,助人须考虑对方的承受程度

帮助他人需考虑各人的分限所能及的&#xff0c;初学圣学需时间沉淀&#xff0c;存养心性 任何人都应该受到教育&#xff0c;不应受到贫富、贵贱的差异而排除在教育之外&#xff0c;对于不同材质的学生&#xff0c;需要因材施教&#xff1b; 每天都有新的认知&#xff0c;大我…

STL—容器—string类【对其结构和使用的了解】【对oj相关练习的训练】

STL—容器—string类 其实string类准确来说并不是容器&#xff0c;因为他出现的时间比STL要早&#xff0c;但是也可以说是容器吧。 1.为什么要学习string类&#xff1f; 1.1C语言当中的字符串 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作…

CTFShow的RE题(三)

数学不及格 strtol 函数 long strtol(char str, char **endptr, int base); 将字符串转换为长整型 就是解这个方程组了 主要就是 v4, v9的关系&#xff0c; 3v9-(v10v11v12)62d10d4673 v4 v12 v11 v10 0x13A31412F8C 得到 3*v9v419D024E75FF(1773860189695) 重点&…

Windows ipconfig命令详解,Windows查看IP地址信息

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 ipconfig 1、基…

Android Studio Run窗口中文乱码解决办法

Android Studio Run窗口中文乱码解决办法 问题描述&#xff1a; AndroidStudio 编译项目时Run窗口中文乱码&#xff0c;如图&#xff1a; 解决方法&#xff1a; 依次打开菜单&#xff1a;Help--Edit Custom VM Options&#xff0c;打开studio64.exe.vmoptions编辑框&#xf…

计算机专业怎么选择电脑

现在高考录取结果基本已经全部出来了&#xff0c;很多同学都如愿以偿的进入到了计算机类专业&#xff0c;现在大部分同学都在为自己的大学生活做准备了&#xff0c;其中第一件事就是买电脑&#xff0c;那计算机类专业该怎么选择电脑呢&#xff1f; 计算机专业是个一类学科&…

网络中的网络 NiN

一、全连接层问题 1、卷积层的参数&#xff1a;输入的通道数乘以输出的通道数再乘以窗口的高宽 2、全连接层的参数就是输入的元素个数乘以输出的元素个数&#xff0c;也就是输入的通道数乘以输入的高宽&#xff0c;再乘以输出的通道数乘以输出的高宽&#xff0c;贼大的量级 …

NLP简介

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此&#xff0c;这一领域的研究将涉及自…

【算法】(C语言):冒泡排序、选择排序、插入排序

冒泡排序 从第一个数据开始到第n-1个数据&#xff0c;依次和后面一个数据两两比较&#xff0c;数值小的在前。最终&#xff0c;最后一个数据&#xff08;第n个数据&#xff09;为最大值。从第一个数据开始到第n-2个数据&#xff0c;依次和后面一个数据两两比较&#xff0c;数值…

关于用户咨询华为擎云L410笔记本安装Windows系统的说明

同样也是单位购买的华为擎云L410 KLVU-WDU0笔记本电脑&#xff0c;国产UOS系统某些软件用着不是很方便&#xff0c;用户咨询是否能够安装Windows10或者Windows7&#xff1f; 带着种种疑问也做了一些查询&#xff0c;之前也给一些国产设备更改过操作系统&#xff0c;之前的国产设…

计算机网络浅谈—什么是 OSI 模型?

开放系统通信&#xff08;OSI&#xff09;模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型&#xff1f; 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型&#xff0c;支持各种通信系统使用标准协议进行通信。简单而言&#xff0c;OSI 为保证…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

Laravel框架详解及使用方法

Laravel是一款开源的PHP Web应用程序框架&#xff0c;它基于MVC&#xff08;模型-视图-控制器&#xff09;架构&#xff0c;以其简单易学、灵活性强、安全性高和强大的社区支持而广受开发者喜爱。以下是对Laravel框架的详细解析及使用方法&#xff1a; 一、Laravel框架简介 1…

刷题——在二叉树中找到最近公共祖先

在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 int lowestCommonAncestor(TreeNode* root, int o1, int o2) {if(root NULL) return -1;if((root->val o1) || (root->val o2)) return root->val;int left lowestCommonAncestor(root->left, o1, o2);i…

【pytorch19】交叉熵

分类问题的loss MSECross Entropy LossHinge Loss &#xff08;SVN用的比较多&#xff09; ∑ i m a x ( 0 , 1 − y i ∗ h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) ∑i​max(0,1−yi​∗hθ​(xi​)) Entropy&#xff08;熵&#xff09; Uncertainty&#xff08;…

ESP32——物联网小项目汇总

商品级ESP32智能手表 [文章链接] 用ESP32&#xff0c;做了个siri&#xff1f;&#xff01;开源了&#xff01; [文章链接]

IPsec连接 和 SSL连接

Psec和SSL连接是两种用于保障网络通信安全的技术 IPsec 通常用于连通两个局域网&#xff0c;主要是网对网的连接&#xff0c;如分支机构与总部之间&#xff0c;或者本地IDC与云端VPC的子网连接。适合站点间的稳定通讯需求以及对网络层安全有严格要求的场合。要求两端有固定的网…