c++实现矩阵乘法和分块矩阵乘法
矩阵A大小 : m * p,矩阵B大小 : p * m,结果矩阵C大小 : m * n,分块的大小为k * k。
废话少说,原理也不提,直接上代码
#include "iostream"
#include "random"
#include "vector"using namespace std;vector<vector<double>> initMatrix(int m, int n);vector<vector<double>> multiply(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b);vector<vector<double>>
multiply_block(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b, int block_size);bool isEqual(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b);int main() {//m * p, p * n, and k represent the size of blockint m = 300, p = 300, n = 300, k = 7;auto matrix_a = initMatrix(m, p), matrix_b = initMatrix(p, n);vector<vector<double>> matrix_c(m, vector<double>(n, 0));auto matrix_c_1 = multiply_block(matrix_a, matrix_b, k);auto matrix_c_2 = multiply(matrix_a, matrix_b);cout << isEqual(matrix_c_1, matrix_c_2);return 0;
}vector<vector<double>> initMatrix(int m, int n) {vector<vector<double>> res(m, vector<double>(n, 0));default_random_engine engine;uniform_real_distribution<double> u(0.0, 200);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {res[i][j] = u(engine);}}return res;
}// normal matrix multiplication
vector<vector<double>> multiply(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b) {int m = matrix_a.size(), p = matrix_a[0].size(), n = matrix_b[0].size();vector<vector<double>> res(m, vector<double>(n, 0));for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {for (int k = 0; k < p; ++k) {res[i][j] += matrix_a[i][k] * matrix_b[k][j];}}}return res;
}// block-based matrix multiplication
vector<vector<double>>
multiply_block(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b, int block_size) {int m = matrix_a.size(), p = matrix_a[0].size(), n = matrix_b[0].size();vector<vector<double>> res(m, vector<double>(n, 0));for (int bi = 0; bi < m; bi += block_size) {for (int bj = 0; bj < n; bj += block_size) {for (int bk = 0; bk < p; bk += block_size) {for (int i = bi; i < min(bi + block_size, m); ++i) {for (int j = bj; j < min(bj + block_size, n); ++j) {for (int k = bk; k < min(bk + block_size, p); ++k) {res[i][j] += matrix_a[i][k] * matrix_b[k][j];}}}}}}return res;
}// to check whether the two results are same
bool isEqual(vector<vector<double>> &matrix_a, vector<vector<double>> &matrix_b) {int m_a = matrix_a.size(), n_a = matrix_a[0].size();int m_b = matrix_b.size(), n_b = matrix_b[0].size();if (m_a != m_b || n_a != n_b)return false;for (int i = 0; i < m_a; ++i) {for (int j = 0; j < n_a; ++j) {if (matrix_a[i][j] != matrix_b[i][j])return false;}}return true;
}
c++实现矩阵乘法和分块矩阵乘法相关推荐
- poj 3233 矩阵乘法(分块矩阵)
POJ 3233 题解:Sn为所求矩阵, 则 这样, 此题就变成了求矩阵幂和矩阵乘法, 分块矩阵乘法和普通矩阵一样的. code: /* adrui's submission Language : C ...
- cache 在X86和ARM的性能比较 - 矩阵累加和分块矩阵乘法
有一段时间在x86和arm服务器下面做开发,需要平台之间的移植,然后经常发现同一段代码在不同平台下面的表现不一样,有一大部分原因是不同平台对cache处理方法不一样. 大部分参考资料上说,cache有 ...
- 矩阵基础 (3). 分块矩阵的加法和乘法运算
摘要 本文主要讲述分块矩阵的加法运算和乘法运算.将矩阵进行分块操作有很多的好处,特别是在高性能并行计算领域内,矩阵的分块化操作更是有很多益处. 1. 分块矩阵加法运算 给定矩阵A,B分别如下, 矩阵A ...
- 线性代数学习笔记(十四)——分块矩阵
本篇笔记首先介绍了分块矩阵的概念,并介绍了按行或按列进行分块的两种常见分块方式,还讨论了矩阵标准形的主要基本特征,然后重点讨论了分块矩阵的几种运算,包括分块矩阵的和.差.数乘和乘积,以及对角型分块矩阵 ...
- 分块矩阵乘法+乒乓操作
本文用system verilog实现了分块矩阵乘法中计算输出矩阵的某一块,并且进行了pingpang操作,以掩盖数据传输时间. 这是顶层模块的代码: `timescale 1ns / 1ps // ...
- 线性代数(四) :矩阵乘法的性质与分块矩阵的运算
了解完矩阵与线性映射的关系后.现在可以讨论下矩阵乘法的运算性质了,这对以后推导其他结果是有帮助的: 1 对于矩阵乘法.交换律不成立 (i)对于行数和列数不相等的矩阵.很明显由于交换之后不能满足矩阵乘法 ...
- 程序性能优化探讨(6)——矩阵乘法优化之分块矩阵
有一种性格叫做偏执,有一种矩阵优化运算叫做分块.实话说,也许我这辈子也用不上这种随牛B但很复杂的算法,有些版本的教材直接删除这个内容.但越是这样我越想不过,因此借写这篇博客,把分块矩阵乘法彻底分析清楚 ...
- 快速幂、矩阵快速幂、快速乘法
快速幂 快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算.我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用for或者是pow就会超时,这时候就用到了快速幂. 快速幂的原理 ...
- 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15
今天凌晨3点才睡,没想到通过看小说抑制玩游戏,反而看小说的时间更长. u1s1:那小说太刺激了,晚上看很有感觉,风吹草动我就会猛地看过去(类似茄子说柜子动了,哈哈),真TM(语气词)练胆量!!!..Q ...
最新文章
- visual assist x太卡了_LeetCode69. x 的平方根
- AI服务器的优势有哪些?人工智能服务器产品有哪些?
- 博客阅读学习笔记-目录
- 【数学基础】参数估计之贝叶斯估计
- javascript file cached in server side
- linux memcacheQ的安装与使用
- 互联网大厂春节礼盒鄙视链
- 字典 python 引用_Python字典引用的应用
- Geoserver:跨域处理
- 手机app登录显示服务器异常,手机app 连接云服务器异常
- 前端的学习之路:初级HTML---图片标签
- laravel 分页查询
- qt构建浏览器_如何为组织构建安全的浏览器
- [python爬虫]喜马拉雅音乐
- 学习UI设计需要学习哪些软件?
- 最简单的直播源抓取方法
- 分享一个横向打印二叉树图形的方法
- 没有独立显卡没有NVIDIA 如何安装pytorch
- 百度快照被劫持百度网址安全中心提醒您:该页面可能已被非法篡改
- iOS 企业签名与超级签名