对于一个二维数组A[m][n],在计算机内存中有两种存储方式:行优先存储和列优先存储。
行优先存储,顾名思义,就是一行的数据存放在一起,然后逐行存放。列优先存储,就是每一列的数据是存储在一起的,一列一列地存放在内存中。这两种存储方法,对于编写遍历二维矩阵的循环语句,还是有一定影响的。比如,如果是按行优先存储的,那么在遍历时,一行一行的读取数据,肯定比一列一列地读取整个数组,要方便许多。
下面以两段程序来说明问题。
这是C++代码。
<pre name="code" class="cpp">#include<iostream>
#include<ctime>
using namespace std;
int main(){
int i,j,m=20;
int a[100][1000];
clock_t start, end;
start = clock();
while(m){
for(i=0; i<100; ++i){
for(j=0; j<1000; ++j){
a[i][j]=1;
}
}
--m;
}
end = clock();
cout<<"case 1 time is: "<<end-start<<endl;
m=20;
start = clock();
while(m){
for(j=0; j<1000; ++j){
for(i=0; i<100; ++i){
a[i][j]=1;
}
}
--m;
}
end = clock();
cout<<"case 2 time is: "<<end-start<<endl;
system("pause");
return 0;
}
在本人机器上,结果如下:
case 1 time is: 4
case 2 time is: 5
请按任意键继续. . .
下面是Matlab代码:
a(100,1000)=0;
tic;
for m=1:20
for i=1:100
for j=1:1000
a(i,j)=1;
end
end
end
time=toc
tic;
for m=1:20
for i=1:1000
for j=1:100
a(j,i)=1;
end
end
end
time=toc
在本人机器上的结果如下:
time =
0.0160
time =
0.0120
由上面的例子我们可以看出,C,C++中是行优先存储的,以第一种循环的方式,效率比较高。在matlab中,是列优先存储的,以第二种方式的运行效率高。