(转)Fortran、matlab 和 C语言中数组的存储方式
2013-05-31 22:19
197 查看
Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。
例如二维数组Amn
(1)行优先顺序
将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。
【例】二维数组Amn的按行优先存储的线性序列为:
a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn
行优先顺序推广到多维数组,可规定为先排最右的下标。
二维数组Amn地址计算公式(数组存储结构以C语言下标表示):
LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
①LOC(a11)是开始结点的存放地址(即基地址)
②d为每个元素所占的存储单元数
(2)列优先顺序
将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
【例】二维数组Amn的按列优先存储的线性序列为:
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
列优先顺序推广到多维数组,可规定为先排最左的下标。
二维数组Amn地址计算公式(数组存储结构以C语言下标表示):
LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
下面是用c语言测试存储方式对计算效率的影响
Program1. 不按计算机规定的存储方式编程
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main ()
{ int i,j;
float a[1000][5000];
clock_t beg, end;
double time;
beg=clock();
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=0.5; }
for (j=0; j<5000; j++) {
for (i=0; i<1000; i++) {
a[i][j]=a[i][j]*a[i][j]+2.0*a[i][j]+10.0; }
end=clock();
time=(double)(end-beg)/CLOCKS_PER_SEC;
printf("Compute time is %f seconds\n",time);
}
Compute time is 0.063000 seconds
Program2.按计算机规定的存储方式编程
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main ()
{ int i,j;
float a[1000][5000];
clock_t beg, end;
double time;
beg=clock();
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=0.5; }
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=a[i][j]*a[i][j]+2.0*a[i][j]+10.0; }
end=clock();
time=(double)(end-beg)/CLOCKS_PER_SEC;
printf("Compute time is %f seconds\n",time);
}
Compute time is 0.046000 seconds
例如二维数组Amn
(1)行优先顺序
将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。
【例】二维数组Amn的按行优先存储的线性序列为:
a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn
行优先顺序推广到多维数组,可规定为先排最右的下标。
二维数组Amn地址计算公式(数组存储结构以C语言下标表示):
LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
①LOC(a11)是开始结点的存放地址(即基地址)
②d为每个元素所占的存储单元数
(2)列优先顺序
将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
【例】二维数组Amn的按列优先存储的线性序列为:
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
列优先顺序推广到多维数组,可规定为先排最左的下标。
二维数组Amn地址计算公式(数组存储结构以C语言下标表示):
LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
下面是用c语言测试存储方式对计算效率的影响
Program1. 不按计算机规定的存储方式编程
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main ()
{ int i,j;
float a[1000][5000];
clock_t beg, end;
double time;
beg=clock();
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=0.5; }
for (j=0; j<5000; j++) {
for (i=0; i<1000; i++) {
a[i][j]=a[i][j]*a[i][j]+2.0*a[i][j]+10.0; }
end=clock();
time=(double)(end-beg)/CLOCKS_PER_SEC;
printf("Compute time is %f seconds\n",time);
}
Compute time is 0.063000 seconds
Program2.按计算机规定的存储方式编程
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main ()
{ int i,j;
float a[1000][5000];
clock_t beg, end;
double time;
beg=clock();
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=0.5; }
for (i=0; i<1000; i++) {
for (j=0; j<5000; j++) {
a[i][j]=a[i][j]*a[i][j]+2.0*a[i][j]+10.0; }
end=clock();
time=(double)(end-beg)/CLOCKS_PER_SEC;
printf("Compute time is %f seconds\n",time);
}
Compute time is 0.046000 seconds
相关文章推荐
- Fortran和 C语言中数组的存储方式
- vc定义数组在matlab矩阵存储方式
- C++与matlab存储方式的不同
- Jedis存储Java对象--Java序列化为byte数组方式
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
- 黑马程序员——IOS学习笔记(C语言存储方式和变量作用域)
- [c进阶01]keil mdk编译器,字符串存储在数组方式,占用内存情况
- 【C语言】文件存储写入信息(文本方式)
- C语言变量的存储方式和生存期
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
- C语言实现判断大端小端存储方式的代码
- c语言变量存储方式
- IOS开发之路--C语言存储方式和作用域
- 浮点数在内存中的存储方式(含c语言实例)
- c语言中浮点数的存储方式
- 第07天C语言(01):数组-内存存储细节
- c语言传递数组给函数的三种方式(注意均为引用传递)
- [转载]数组在内存中的存储方式
- C语言学习笔记:12_变量的存储方式和生存期
- c语言变量的存储方式(auto,register,static,extern)及作用域(局部变量/全局变量)详解