多线程读取矩阵文件+多线程矩阵乘法(C++实现)
算法概述
- 矩阵乘法可以在算法层面上进行并行。
- 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++实现)相关推荐
- 多线程读取大文件,尤其是对日志文件分析很有用。
我在之前的公司里工作的时候,他们要求我做一个能够分析IIS日志的程序,可我做来做去,也只能做到,1个G的文件读取在140秒左右.愁了很久,想到了用多线程读取大文件的方法,又发现文件读取流可以有很多个, ...
- JAVA实现环形缓冲多线程读取远程文件
2019独角兽企业重金招聘Python工程师标准>>> 如果用HttpURLConnection类的方法打开连接,然后用InputStream类获得输入流,再用BufferedInp ...
- 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景
Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...
- Java多线程读取excel文件_解决springboot 多线程使用MultipartFile读取excel文件内容报错问题...
springboot项目开启多线程 启动类加注解开启 @EnableAsync,实现类方法加注解 @Async 前端页面 报错信息 java.io.FileNotFoundException: C:\ ...
- java线程池读文件_多线程读取Java文件
我正在创建线程以读取Java中的文件.当我创建2个线程时,每个线程都读取整个文件,而我希望它们读取文件的不同部分.我尝试放入sleep(),join(),yield(),但是在包含它们之后,这只会减慢 ...
- Java多线程读取文件
多线程读取单文件 package com.qwx.test;import java.io.*;/*** @ClassName: ReadFile* @Description: java类作用描述* @ ...
- java多线程 文件夹_java多线程读同一个文件
java多线程同时读取一个文件,这个方法可行吗?不可行. 多线程能够提高效率是因为现在的cpu普遍是多核cpu, 多条线程可以在多个内核中同时执行来提高计算效率.但是计算机磁盘的磁头只有一个,即使多条 ...
- php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件
PHP读取大文件源码示例,通过PHP读取过大.超大型文件的思路及解决方案. 在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页 ...
- python读取csv某一列存入数组_python 读取.csv文件数据到数组(矩阵)的实例讲解
利用numpy库 (缺点:有缺失值就无法读取) 读: import numpy my_matrix = numpy.loadtxt(open("1.csv","rb&qu ...
最新文章
- 机器学习让3D设计速度提升7倍!Adobe最新Substance 3D小白也能入门
- python使用教程cmd啥意思-python中执行cmd的方式
- DuiLib学习笔记5——标题栏不能正常隐藏问题
- 突发:ORA-12541:TNS:无监听程序 的调查解决方法(监听日志已满导致)
- 升级 Visual Studio 2015 CTP 5 的坑、坑、坑
- Eclipse将引用了第三方jar包的Java项目打包成jar文件
- 【另类见解】一致性哈希就能解决分库分表问题了?
- PPA格式Linux安装,Ubuntu12.04 用PPA安装fcitx和搜狗输入法附加组件Linux版
- shell 特殊符号
- 真正的创业者和伪创业者的区别在哪里?
- web中“/”写在不同地方时的值不同
- ajax fetch api,fetch 简介: 新一代 Ajax API
- windows下设置tomcat自动启动的注意事项
- 计算机在哪里设置定时休眠,win7系统设置定时开关机休眠唤醒的详细办法
- Wordpress中wp-admim管理后台(404)无法进入,无限循环跳出解决方法
- Dispatch简介
- CPU和内存的电路设计09-计数器的内部电路实现
- HTTP和AJAX重点知识
- ios开发者添加开发测试机
- 全基因DNA甲基化检测“金标准”--- 改进版简化基因组甲基化测序