矩阵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++实现矩阵乘法和分块矩阵乘法相关推荐

  1. poj 3233 矩阵乘法(分块矩阵)

    POJ 3233 题解:Sn为所求矩阵, 则 这样, 此题就变成了求矩阵幂和矩阵乘法, 分块矩阵乘法和普通矩阵一样的. code: /* adrui's submission Language : C ...

  2. cache 在X86和ARM的性能比较 - 矩阵累加和分块矩阵乘法

    有一段时间在x86和arm服务器下面做开发,需要平台之间的移植,然后经常发现同一段代码在不同平台下面的表现不一样,有一大部分原因是不同平台对cache处理方法不一样. 大部分参考资料上说,cache有 ...

  3. 矩阵基础 (3). 分块矩阵的加法和乘法运算

    摘要 本文主要讲述分块矩阵的加法运算和乘法运算.将矩阵进行分块操作有很多的好处,特别是在高性能并行计算领域内,矩阵的分块化操作更是有很多益处. 1. 分块矩阵加法运算 给定矩阵A,B分别如下, 矩阵A ...

  4. 线性代数学习笔记(十四)——分块矩阵

    本篇笔记首先介绍了分块矩阵的概念,并介绍了按行或按列进行分块的两种常见分块方式,还讨论了矩阵标准形的主要基本特征,然后重点讨论了分块矩阵的几种运算,包括分块矩阵的和.差.数乘和乘积,以及对角型分块矩阵 ...

  5. 分块矩阵乘法+乒乓操作

    本文用system verilog实现了分块矩阵乘法中计算输出矩阵的某一块,并且进行了pingpang操作,以掩盖数据传输时间. 这是顶层模块的代码: `timescale 1ns / 1ps // ...

  6. 线性代数(四) :矩阵乘法的性质与分块矩阵的运算

    了解完矩阵与线性映射的关系后.现在可以讨论下矩阵乘法的运算性质了,这对以后推导其他结果是有帮助的: 1 对于矩阵乘法.交换律不成立 (i)对于行数和列数不相等的矩阵.很明显由于交换之后不能满足矩阵乘法 ...

  7. 程序性能优化探讨(6)——矩阵乘法优化之分块矩阵

    有一种性格叫做偏执,有一种矩阵优化运算叫做分块.实话说,也许我这辈子也用不上这种随牛B但很复杂的算法,有些版本的教材直接删除这个内容.但越是这样我越想不过,因此借写这篇博客,把分块矩阵乘法彻底分析清楚 ...

  8. 快速幂、矩阵快速幂、快速乘法

    快速幂 快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算.我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用for或者是pow就会超时,这时候就用到了快速幂. 快速幂的原理 ...

  9. 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15

    今天凌晨3点才睡,没想到通过看小说抑制玩游戏,反而看小说的时间更长. u1s1:那小说太刺激了,晚上看很有感觉,风吹草动我就会猛地看过去(类似茄子说柜子动了,哈哈),真TM(语气词)练胆量!!!..Q ...

最新文章

  1. visual assist x太卡了_LeetCode69. x 的平方根
  2. AI服务器的优势有哪些?人工智能服务器产品有哪些?
  3. 博客阅读学习笔记-目录
  4. 【数学基础】参数估计之贝叶斯估计
  5. javascript file cached in server side
  6. linux memcacheQ的安装与使用
  7. 互联网大厂春节礼盒鄙视链
  8. 字典 python 引用_Python字典引用的应用
  9. Geoserver:跨域处理
  10. 手机app登录显示服务器异常,手机app 连接云服务器异常
  11. 前端的学习之路:初级HTML---图片标签
  12. laravel 分页查询
  13. qt构建浏览器_如何为组织构建安全的浏览器
  14. [python爬虫]喜马拉雅音乐
  15. 学习UI设计需要学习哪些软件?
  16. 最简单的直播源抓取方法
  17. 分享一个横向打印二叉树图形的方法
  18. 没有独立显卡没有NVIDIA 如何安装pytorch
  19. 百度快照被劫持百度网址安全中心提醒您:该页面可能已被非法篡改
  20. iOS 企业签名与超级签名

热门文章

  1. [ZJOI2015] 诸神眷顾的幻想乡
  2. 星巴克推出NFT收藏品,18分钟内售罄!
  3. java中题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
  4. Java企业级开发框架(二):涉及的技术
  5. 1006 Problem G A+B 输入输出练习VII
  6. 不必翻墙,安装vue浏览器插件
  7. 直接通过adb shell cmd直接打开android apk
  8. Docker基本用法安装部署
  9. python类中包含类_彻底搞懂Python中的类
  10. 自媒体行业中是否可以使用IP代理