C中实现矩阵乘法的一种高效的方法

C语言中矩阵乘法的实现 在这里插入代码片@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 阅读详情

作者: 字体:[增加 减小] 类型:转载 时间:2013-05-04 我要评论

本篇文章介绍了,在C中实现矩阵乘法的一种高效的方法。需要的朋友参考下

如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:

复制代码代码如下:

for(i=0;i<n;++i)
    for(j=0;j<n;++j){
        sum=0;
        for(k=0;k<n;++k)
            sum+=A[i][k]*B[k][j];
        C[i][j]+=sum;
}

但是考虑了高速缓存的问题后,其实有一种更好的实现方式:
复制代码代码如下:


for(i=0;i<n;++i)
    for(k=0;k<n;++k){
        r=A[i][k];
        for(j=0;j<n;++j)
            C[i][j]+=r*B[k][j];
}



细看一番就会发现这两种实现语义是等价的,但是后者的实际运行效率却比前者高。

那为什么会如此呢?

那是因为CPU读数据时,并不是直接访问内存,而是先查看缓存中是否有数据,有的话直接从缓存读取。而从缓存读取数据比从内存读数据快很多。

当数据不在缓存中时,CPU会将包含数据在内的一个数据块读到缓存,如果程序具有良好空间局部性,那么第一次cache miss后,之后的几次数据访问就可以直接在缓存中完成。除了空间局部性(程序倾向于引用与当前数据邻近的数据)之外,还有时间局部性(程序倾向于引用最近被引用过的数据)。

回到矩阵乘法。(我们只考虑内循环)

前者对矩阵A,有良好的空间局部性,假设一次能缓存四个元素,则每次迭代对于A只有0.25次miss,但是对于B,则不然,因此B是按列访问的,每次访问都会miss,因此每次迭代总的miss数是1.25。

后者对于矩阵C和矩阵B都有良好的局部性,每次迭代都只有0.25词miss,因此总的miss数是0.5。后者每次迭代多了一次存储(对C[i][j]写入),但是即便如此,后者的运行效率也比前者高。

总而言之,要想程序跑得快,就要在程序中多利用局部性,让缓存hold住你的数据,减少访存次数。要知道CPU可以在3个时钟周期内访问到L1 cache,10个时钟周期左右的时间访问到L2 cache。访问内存却要上百个时钟周期,孰快孰慢,很清楚了吧?

数据结构 --- 稀疏矩阵的基本运算 # include <stdio.h> # include <stdlib.h> # define M 4 # define N 4 # define MaxSize 200 # define ElemType int typedef struct { int r;//行号 int c;//列号 ElemType d;//元素值 }TupNo... 阅读详情

相关推荐

C/C++ 矩阵求幂Matrix Exponentiation算法详解及源码

矩阵求幂(Matrix Exponentiation)算法是一种用于快速计算矩阵的幂次的算法。通常情况下,直接计算矩阵的幂次的时间复杂度非常高,而矩阵求幂算法通过利用矩阵的特性,将计算复杂度降低到更低的级别。矩阵求幂算法的基本思想是通过将矩阵幂次进行二进制分解,并利用矩阵连乘的性质来加速运算。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 8190

用c 语言中 矩阵乘法,C中实现矩阵乘法的一种高效的方法

如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:for(i=0;ifor(j=0;jsum=0;for(k=0;ksum+=A[i][k]*B[k][j];C[i][j]+=sum;}但是考虑了高速缓存的问题后,其实有一种更好的实现方式:for(i=0;ifor(k=0;kr=A[i][k];for(j=0;jC[i][j]+=r*B[k][j];}细看一番就会发现这两种实...

weixin_35338559的博客 437

WIN下使用visual studio 2022安装GMSSL命令行工具

2.1 使用管理员权限打开visual studio(非常重要,否则最后一步 nmake install会失败)右键vs2022,以管理员身份运行即可。2.4 配置环境变量,gmssl可执行程序默认会被安装到如下目录。将如下路径添加到系统环境变量即可。添加后的环境变量如下。2.编译解压后的gmssl源码,编译过程主要参考install.md中的内容,README.md中的步骤不完整。2.2 打开vs2022的命令终端,右键文件,选择在终端中打开。1.下载gmssl源码,解压到相应目录。

qq_45794382的博客 1269

矩阵乘法 分块 c语言,转置矩阵的分块并行乘法(C语言实现),计算矩阵C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子块大小为S*T,其算法实现原理参加本代码的...

#include #define rawm 4#define rawn 4#define rawp 4//子矩阵的大小为S行*T列#define S 2 //块矩阵的行#define T 4 //块矩阵的列typedef float data_type;//定义为32位浮点数//将矩阵定义为全局常量和变量//data_type rawA[rawm][rawn] = {4,2,3,3,2,1,4...

weixin_31907553的博客 1058

NVMe-MI --- Message Servicing Model(消息服务模型)

本文主要介绍NVMe-MI消息服务模型,两个主要类别是请求消息和响应消息。并介绍带外机制消息服务状态机。

智小星的博客 2009

STM32开发者必看:如何在正点原子探索者开发板上快速移植CANopenNode协议栈

本文为STM32开发者提供了在正点原子探索者开发板上快速移植CANopenNode协议栈的实战指南。文章详细介绍了从环境准备、硬件抽象层适配到协议栈初始化与测试的全过程,并分享了PDO配置与性能优化等关键技巧,帮助开发者高效实现CANopen标准化通信。

weixin_29173777的博客 462

矩阵乘法-分块计算

将整个矩阵分解为这样的小块,每次完成一对小块的计算,以提高Cache的命中率。提示:  图中n=N/m计算次序为A11*B11, A11*B12,…, A11*B1n,,由于反复使用A11,因此可以提高Cache的命中率。 /* 矩阵分开计算 C=A*B --- C(i,j)等于A的第i行乘以第j列 */ #include &lt;stdio.h&gt; #include ...

weixin_33755554的博客 931

别再只会调速度了!用STM32的定时器中断精准控制伺服电机转角(避坑指南)

本文详细介绍了如何利用STM32的定时器中断和PWM输出实现伺服电机的精准转角控制,避免常见的速度控制误区。通过硬件配置、脉冲计数逻辑和优化技巧的实战讲解,帮助开发者掌握高精度位置控制方法,适用于工业自动化和机器人控制等场景。

weixin_42531163的博客 414

php矩阵乘法,C中实现矩阵乘法的一种高效的方法

如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:for(i=0;ifor(j=0;jsum=0;for(k=0;ksum+=A[i][k]*B[k][j];C[i][j]+=sum;}但是考虑了高速缓存的问题后,其实有一种更好的实现方式:for(i=0;ifor(k=0;kr=A[i][k];for(j=0;jC[i][j]+=r*B[k][j];}细看一番就会发现这两种实...

weixin_39624429的博客 152

用易经智慧看懂人工智能:64卦中的科技密码--当古老智慧遇见未来科技

在人工智能狂飙突进的今天,我们总在追问:这些代码构建的智能究竟会带人类走向何方?或许答案早已藏在《周易》的六十四卦中——这本中华文明的“源代码”,正用一种跨越时空的语言,悄悄解释着最前沿的科技秘密。

weixin_38410320的博客 2081

Proxmox(pve)集群(4)存储(1)配置分布式存储ceph

它使用一种称为CRUSH(Controlled Replication Under Scalable Hashing)算法的数据分布算法来将数据均匀地分布在多个存储节点上,并确保数据的冗余和容错。它负责管理数据的分布、冗余和自动修复。PVE支持本地存储、LVM、NFS、iSCSI、CephFS、RBD、ZFS等存储方式,我这里使用两种存储方式,一种是通过ceph实现分布式存储,一种是通过truenas实现集中式存储。自我管理和自动恢复:Ceph具有自我管理的特性,可以动态地调整和优化存储集群的配置。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2623

稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现

一、思路。 1.创建。 可以直接赋值字符串,但是为0的元素也要依次赋值,比较麻烦,但是容易理解也能实现。 其次也可以构思三元组赋值,只赋值非零元素和它的行,列数,在打印时进行if判断,没有赋值的就输出0,这样比较简单。 创建结构体时,一个矩阵需要有它的行总数和列总数,并且针对三元组,你还需要每个元素所在的行和列,还有这个三元组的非零元素总和。 2.遍历。 对于三元组,它包括非零元素集合和零元素集合,针对于非零元素的行,列数,进行双重for循环,如果非零元素的行,列数与for循环中的变量相等,就输

m0_61395860的博客 9755

ANSYS软件二次开发(2):二次开发环境搭建与配置

ADK是ANSYS提供的一个开发工具包,它包含了用于二次开发的API、示例代码和开发指南。ADK支持Python和Tcl,但Python因其易用性和强大的社区支持,成为首选。在ANSYS软件中,自定义菜单与工具栏是实现二次开发的重要途径之一,它允许用户根据自己的需求和工作流程,创建个性化的操作界面。通过自定义菜单与工具栏,可以将常用的功能、自定义的脚本或宏命令整合到一起,提高工作效率。原因:材料参数输入错误,或者模型的物理假设与实际情况不符。解决方案仔细校验材料参数,确保与实验数据一致。

kkchenjj的博客 2201

三元组矩阵存储格式下矩阵乘法matlab代码

三元组矩阵存储格式下矩阵乘法matlab代码 博客用不来直接发代码了 function [ C ] = syzjzcf( A,B ) % 输入可相乘的、行优先的三元组矩阵A,B % 输出为相乘结果C mA= A(1,1);%A矩阵中的行数 nA= A(1,2);%A的列数 mB=nA;%B矩阵中的行数 nB= B(1,2);%B的列数 %行优先算乘法结果,结果共有mA行,nB列 C = ze...

ysh的博客 814

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4788

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NOJ-稀疏矩阵的乘法-西工大数据结构

    这道题也是上周就写了的,今天晚上赶紧发出来。题目如下:    看一下题目,就是三元组表稀疏矩阵的乘法,然后输出。    首先将矩阵每行的非0元个数记下来,那么矩阵每行第一个非0元在三元表的位置就是上一行非0元个数加上上一行首个非0元位置之和。这样就可以不用遍历三元表,就可以快速找到相应的三元组表元素。相乘时先将结果存入一个数组中,然后取其中非0元素存入新的三元组表。最后输出新三元组表即可。...

FREEstriker的博客 2720

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Matrix Multiplication (利用随机化检验矩阵乘法)

You are given threen×nmatricesA,BandC. Does the equationA×B=Chold true? Input The first line of input contains a positive integern(n≤ 500) followed by the the three matricesA,Ban...

crosnken的博客 782

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据结构课程设计稀疏矩阵的三元组存储

数据结构课程设计稀疏矩阵的三元组存储要求代码实现 要求 利用C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。设计并实现稀疏矩阵的三元组存储结构,并完成如下操作。 ...

qq_41127790的博客 1119

稀疏矩阵乘法

#include <iostream> #include <malloc.h> #include <cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r;...

weixin_30502965的博客 205

【PyTorch】计算局部相似矩阵

计算局部相似矩阵 代码文档:https://github.com/lartpang/mypython/blob/master/2019-09-25%E8%AE%A1%E7%AE%97%E5%B1%80%E9%83%A8%E7%9B%B8%E5%85%B3%E6%80%A7%E7%9F%A9%E9%98%B5/%E8%AE%A1%E7%AE%97%E5%B1%80%E9%83%A8%E7...

weixin_30432007的博客 1289

c语言版数据结构(奇迹冬瓜)-数组和广义表(稀疏矩阵的乘法)

//-------矩阵的乘法--------- /* 假设题目: 3 0 0 5 0 2 0 6 M= 0 -1 0 0 N= 1 0 Q=-1 0 Q=M*N 2 0 0 0 -2 4 0 4 0 0 (表1) 非零元三元表: M: N:

runner2012的专栏 3300

牛客国庆集训派对Day3 - A 矩阵乘法 分块

题目链接 题意:矩阵A,每个数用十六进制表示,矩阵B,一列用一个二进制数表示,一个数为一个0或者1。求矩阵C=A*B中每个元素的异或和。 思路:可以看的出来B的每一列的二进制数就相当于A中某一行的元素中某一列元素是否要加上。比如01011,那么A中对应第一列和第三列的元素就不用加,那么我们可以通过预处理所有状态求出每个状态当前那一行的元素和。由于要节省时间,那么我们可以每8列合并成一个整体计算...

a302549450的博客 234

利用异构计算(DPC++)实现二维矩阵乘法

当前计算机体系结构正朝着异构计算的方向发展,各种加速器和协处理器的出现推动了并行计算的发展。一些计算密集型应用中,使用多核 CPU 甚至已经不能满足需求,需要使用 GPU 进行计算加速。然而,使用 GPU 进行计算加速并不是一件容易的事情。开发者需要熟悉各种不同的 GPU 编程语言,例如 CUDA,OpenCL 等。并且,不同的 GPU 有着不同的架构和特性,为程序的编写带来一定的复杂度,这使得并行计算的开发难度倍增。为了解决这个问题,英特尔推出了一项新的计算架构:DPC++。

weixin_63101658的博客 481

对称矩阵的压缩存储及基本运算(2)

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 对称矩阵压缩存储的实现与应用.cpp *作 者: 郑兆涵 *对称矩阵的压缩存储及基本运算(2) */

Henry's Blog 947

矩阵快速幂

struct Matrix { double mat[2][2]; }; Matrix mul(Matrix a, Matrix b) { Matrix ret; for(int i = 0; i < 2; ++i) { for(int j = 0; j < 2; ++j) { ret.mat[i][j] = 0;

ACMer_AK的博客 417
上一篇: C++中汉字字符串的截取
下一篇: 深入理解void以及void指针的含义
流左沙
博客等级 码龄11年 46粉丝 55原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值