c语言为什么先存储行后存储列,C语言行优先和列优先的问题深入分析
C语言行优先和列优先的问题深入分析
摘要
本文主要探讨的是“行优先”原则和“列优先”原则的问题。
1. 背景
首先了解“行优先”和“列优先”的知识,这两种方式在数学上的直观描述如下,给定如下矩阵:
根据行优先的原则,其排序方式为
根据列优先的原则,其排序方式为
2. 计算机领域的应用
行列优先原则在计算机领域的应用主要如下。行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差。所以,我们应该尽量在行优先机制的编译器,比如C/C++,CUDA等等上,采用行优先的数据存储方式;在列优先机制的编译器,比如Fortune, Matlab等等上,采用列优先的数据存储方式。但这种思想渗透到编程中之后,代码的质量就会提高一个档次。
3. 以矩阵计算为例(Matlab编译器下测试)
?
4. 测试和分析
测试结果如上图所示,第一个时间为Matlab自带的乘法运算,第二个为我们原始实现的乘法计算,第三个为循环中行列变换(适应列优先编译器的处理)。
最重要的是第四个是本人原创的矩阵乘法方法,简单地说就是将A矩阵转置,然后设计相应的算法实现矩阵乘运算。在这个点上,希望在理解原理的基础上能给读者一些启发。在本例中,这样做效率最高,原因其一是本例中原始数据结构上适合我这样处理;原因其二是这样做的目的是使得任何一个子乘法的处理上,两乘数所在的内存空间上都是连续,而不仅仅是一个连续(注意:这是本文的核心,读者理解透了一定会很有收获,认真看我给出的程序实现。这是核心,不懂的可以交流思想)!
另外,本文中我给出的这个方法是矩阵乘法里面最优的方法,至少数学逻辑上是这样。之所以Matlab自带的乘法计算之所以性能还不错,是因为Matlab自带的运算都是经过优化的,包括硬件加速,系统加速等自己设计的应用很能调用加速方法。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
c语言为什么先存储行后存储列,C语言行优先和列优先的问题深入分析相关推荐
- c语言参数传入函数赋值后传出来,c语言第10次实验内容函数2邹显春.ppt
c语言第10次实验内容函数2邹显春 * #include void call(int, double, double);//使用函数前需要声明 double addition(double,doubl ...
- c语言 打印共九行的菱形,用C语言打印图案的几种实现方法
循环的使用 维普资讯 http://doc.xuehai.net 科技伯. 1 1 0计算机与信息技术 0 S IN E I F R TO CE C N O MA I N 20 06年第 4期 用 C ...
- C语言变量的定义包括变量存储类型和变量的什么?
C语言变量的定义包括变量存储类型和变量的名称.C语言定义变量的格式:"数据类型 变量名;","数据类型"表示想要存储什么类型的数据,"变量名" ...
- C语言基础笔记之12:存储类别、链接和内存管理
Tips1: 关键字:auto.extern.static.register.const.volatile.restricted. _Thread_local._Atomic 函数:rand().sr ...
- InnoDB 存储引擎中的表锁和行锁详解
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储
(1)稀疏矩阵的特点 在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子.通常当△≤0.05时.认为该矩阵为稀疏矩阵. 对这类矩阵实现压缩存储的基本思路是只需要存储 ...
- 为什么MaxCompute采用列式存储?列式存储和行式存储的主要区别在哪
摘要: 1 为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的.简单来说两者的区别就是如何组织表 ...
- 以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现
<数据结构C语言版 串的块链存储表示和实现>由会员分享,可在线阅读,更多相关<数据结构C语言版 串的块链存储表示和实现(13页珍藏版)>请在人人文库网上搜索. 1.*数据结构C ...
- C语言利用图的邻接矩阵的存储方式实现拓扑排序
C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具.比如"课程开课顺序,施工进程,软件开发进程",我们在使用有向 ...
最新文章
- 看我如何下载韩寒博客文章笔记
- 嵌入式开发试题1-100
- ES5新增的方法——数组的方法
- oracle loder nextval,ORA-07445: 出现异常错误: 核心转储
- URLScan工具配置方法第1/2页
- 使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)
- ICCV 2019 | 微软开源跨视图融合的3D人体姿态估计算法,大幅改进SOTA精度
- .net里面实现javascript中的 escape 和 unescape 功能
- OpenShift 4 - Knative教程(2) 基于Revision/Tag/Traffic实现蓝绿部署和恢复发布
- IC卡插入与触点激活时序
- List、Set、Map比较
- 计算机应用基础146jpg,计算机应用基础——复习题2.pdf
- bex5 mysql_Bex5开发技巧之MYSQL Incorrect string value
- python字典类型中键可以是数字吗_python字典key不能是或可以是啥类型
- GAT GAX 简介
- 利用Photoshop对证件照换底且抠出头发丝
- BZOJ 2716/CH 4701 天使玩偶
- Python 实现Ridge Regression教程
- 利用python实现3种梯度下降算法
- 华为智慧搜索 v9.1.2.300
热门文章
- postman连接数据库
- 泰拳的快感之一——我看《拳霸》
- Pyside2打包成exe-用cxfreeze
- 伯凡时间-160218 十个能让你的无形资产增值的好习惯(转)
- SharePoint 2010 创建联系人列表和使用联系人列表
- 华展云-让展览更高效 2017年第35届中国国际体育用品博览会会刊(参展商名录)
- ext4 xfs mysql对比_ext4与xfs比有什么优势和劣势。
- 科研实习 | 清华大学NISL实验室招收网络和应用安全方向访问学生/博后/工程师...
- 【小程序 | 黑马优选】tabBar、首页制作
- 乐观锁、悲观锁、分布式锁的总结