對於一個二維數組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中,是列優先存儲的,以第二種方式的運行效率高。