算法概述

  • 矩阵乘法可以在算法层面上进行并行。
  • vector< vector > Mat[3]; 这个二维向量数组就是来放做矩阵乘法中的那些矩阵的。Mat[0]是矩阵A,Mat[1]是矩阵B,Mat[2]是乘法的结果矩阵。所以下图中关于这个就做了类似的修改。
  • readMat就是用来读取特定的矩阵。注意,这里的target矩阵要用指针,如果改成用引用的模式,就会报错。这可能跟引用的机制有关,具体没有深入研究过。
  • run_test_parallel函数就是用来算结果矩阵的每一行的。
  • filenames这个数组,用来放文件名。(注意,需要使用const char* []
  • vt.clear();结束之后,记得将这个线程向量给clear掉,后面也用到了。节省空间。
  • if (Mat[0][0].size() == Mat[1].size()) 是用来判断是否可以进行矩阵乘法的。
  • 之后初始化结果矩阵的时候,算法复杂度是O(a+c),而不是一般认为的O(a*c)
  • 再来就是计算矩阵乘法,并输出结果了。

程序

#include <iostream>
#include <vector>
#include <fstream>
#include <thread>
using namespace std;
vector< vector<int> > Mat[3];void readMat(const char* filename, vector< vector<int> >* target) {int a, b, c;ifstream in(filename);in >> a >> b;for (int i = 0; i < a; ++i) {vector<int> temp;for (int j = 0; j < b; ++j) {in >> c;temp.push_back(c);}(*target).push_back(temp);temp.clear();}in.close();
}
void run_test_parallel(int row_index, int column_cntA, int column_cntB)
{// Go over every column of matrixBfor (int i = 0; i<column_cntB; i++){// to compute every element of (row_index)-th row of answerMat[2][row_index][i] = 0;// Compute the answer// Number of columns in A = Number of rows in Bfor (int j = 0; j<column_cntA; j++)Mat[2][row_index][i] += Mat[0][row_index][j] * Mat[1][j][i];}
}
int main() {const char *filenames[] = { "1.txt", "2.txt" };vector<thread> vt;for (int i = 0; i < 2; ++i)vt.push_back(thread(readMat, filenames[i], &Mat[i]));for (int i = 0; i < 2; ++i)vt[i].join();vt.clear();if (Mat[0][0].size() == Mat[1].size()) {int a = Mat[0].size(), b = Mat[1].size(), c = Mat[1][0].size();vector<int> temp;for (int j = 0; j < c; ++j) temp.push_back(0);for (int i = 0; i < a; ++i)  Mat[2].push_back(temp);// Create a threads, because there are a rows in Mat[0]// Each thread will be running function "run_test_parallel"for (int i = 0; i<a; i++)vt.push_back(thread(run_test_parallel, i, b, c));for (int i = 0; i<a; i++)vt[i].join();for (int i = 0; i < 2; ++i) {for (int j = 0; j < Mat[i].size(); ++j) {for (int k = 0; k < Mat[i][j].size(); ++k) {cout << Mat[i][j][k] << " ";}cout << endl;}if (i == 0)cout << "MULTIPLED\n";elsecout << "EQUAL TO --->\n";}for (int i = 0; i < a; ++i) {for (int j = 0; j < c; ++j) {cout << Mat[2][i][j] << " ";}cout << endl;}}else {cout << "Can't Multiple!!\n";}system("pause");return 0;
}

多线程读取矩阵文件+多线程矩阵乘法(C++实现)相关推荐

  1. 多线程读取大文件,尤其是对日志文件分析很有用。

    我在之前的公司里工作的时候,他们要求我做一个能够分析IIS日志的程序,可我做来做去,也只能做到,1个G的文件读取在140秒左右.愁了很久,想到了用多线程读取大文件的方法,又发现文件读取流可以有很多个, ...

  2. JAVA实现环形缓冲多线程读取远程文件

    2019独角兽企业重金招聘Python工程师标准>>> 如果用HttpURLConnection类的方法打开连接,然后用InputStream类获得输入流,再用BufferedInp ...

  3. 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景

    Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...

  4. Java多线程读取excel文件_解决springboot 多线程使用MultipartFile读取excel文件内容报错问题...

    springboot项目开启多线程 启动类加注解开启 @EnableAsync,实现类方法加注解 @Async 前端页面 报错信息 java.io.FileNotFoundException: C:\ ...

  5. java线程池读文件_多线程读取Java文件

    我正在创建线程以读取Java中的文件.当我创建2个线程时,每个线程都读取整个文件,而我希望它们读取文件的不同部分.我尝试放入sleep(),join(),yield(),但是在包含它们之后,这只会减慢 ...

  6. Java多线程读取文件

    多线程读取单文件 package com.qwx.test;import java.io.*;/*** @ClassName: ReadFile* @Description: java类作用描述* @ ...

  7. java多线程 文件夹_java多线程读同一个文件

    java多线程同时读取一个文件,这个方法可行吗?不可行. 多线程能够提高效率是因为现在的cpu普遍是多核cpu, 多条线程可以在多个内核中同时执行来提高计算效率.但是计算机磁盘的磁头只有一个,即使多条 ...

  8. php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件

    PHP读取大文件源码示例,通过PHP读取过大.超大型文件的思路及解决方案. 在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页 ...

  9. python读取csv某一列存入数组_python 读取.csv文件数据到数组(矩阵)的实例讲解

    利用numpy库 (缺点:有缺失值就无法读取) 读: import numpy my_matrix = numpy.loadtxt(open("1.csv","rb&qu ...

最新文章

  1. 机器学习让3D设计速度提升7倍!Adobe最新Substance 3D小白也能入门
  2. python使用教程cmd啥意思-python中执行cmd的方式
  3. DuiLib学习笔记5——标题栏不能正常隐藏问题
  4. 突发:ORA-12541:TNS:无监听程序 的调查解决方法(监听日志已满导致)
  5. 升级 Visual Studio 2015 CTP 5 的坑、坑、坑
  6. Eclipse将引用了第三方jar包的Java项目打包成jar文件
  7. 【另类见解】一致性哈希就能解决分库分表问题了?
  8. PPA格式Linux安装,Ubuntu12.04 用PPA安装fcitx和搜狗输入法附加组件Linux版
  9. shell 特殊符号
  10. 真正的创业者和伪创业者的区别在哪里?
  11. web中“/”写在不同地方时的值不同
  12. ajax fetch api,fetch 简介: 新一代 Ajax API
  13. windows下设置tomcat自动启动的注意事项
  14. 计算机在哪里设置定时休眠,win7系统设置定时开关机休眠唤醒的详细办法
  15. Wordpress中wp-admim管理后台(404)无法进入,无限循环跳出解决方法
  16. Dispatch简介
  17. CPU和内存的电路设计09-计数器的内部电路实现
  18. HTTP和AJAX重点知识
  19. ios开发者添加开发测试机
  20. 全基因DNA甲基化检测“金标准”--- 改进版简化基因组甲基化测序

热门文章

  1. unet图片数据增强_numpy实现深度学习遥感图像语义分割数据增强(支持多波段)
  2. Chrome 正在测试标签页的预览功能
  3. 2-Tenor AF AFT400-实战-Lync Server 2010-集成-2012-01-19
  4. 【转】解决wine中文乱码的问题
  5. 由IP和掩码计算广播地址
  6. xpath IE 7
  7. 网络基础---物理层
  8. SupeSite后台添加新闻增加【预览】功能
  9. MATLAB概率密度函数估计
  10. 《推荐系统实践》要点思维导图