行列優先存儲與循環

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章