c语言 matlab数组初始化,(转)Fortran、matlab 和 C语言中数组的存储方式

本文介绍了C语言中多维数组的行优先和列优先存储方式,以及它们对计算效率的影响。通过两个程序示例对比,显示了遵循计算机内存存储规则编程可以提高计算速度。行优先存储时,内循环按行进行,而列优先存储时,内循环按列进行。测试结果显示,按行优先存储方式的程序运行时间更短。
摘要由CSDN通过智能技术生成

Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。

例如二维数组Amn

0818b9ca8b590ca3270a3433284dd417.png

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值