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