使用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.pswp.cn/diannao/41984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41984.shtml
英文地址,請注明出處:http://en.pswp.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的子網連接。適合站點間的穩定通訊需求以及對網絡層安全有嚴格要求的場合。要求兩端有固定的網…