Fortran和 C语言中数组的存储方式

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

    例如二维数组Amn

 
(1)行优先顺序
     将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。
  【例】二维数组A mn的按行优先存储的线性序列为:
                a 11,a 12,…,a 1n,a 21,a 22,…,a 2n,……,a m1,a m2,…,a mn
        行优先顺序推广到多维数组,可规定为先排最右的下标。
        二维数组Amn地址计算公式(数组存储结构以C语言下标表示)
        LOC(a ij)=LOC(a 11)+[(i-1)×n+j-1]×d
      其中:
  ①LOC(a 11)是开始结点的存放地址(即基地址)
  ②d为每个元素所占的存储单元数
  ③由地址计算公式可得,数组中任一元素可通过地址公式在相同时间内存取。即顺序存储的数组是随机存取结构。
(2)列优先顺序
     将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
  【例】二维数组A mn的按列优先存储的线性序列为:
                 a 11,a 21,…,a m1,a 12,a 22,…,a m2,……,a 1n,a 2n,…,a mn
        列优先顺序推广到多维数组,可规定为先排最左的下标。
        二维数组Amn地址计算公式(数组存储结构以C语言下标表示)
          LOC(a ij)=LOC(a 11)+[(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)