C語言行優先和列優先的問題深入分析

2022-10-04 01:24:12 字數 2272 閱讀 7440

c語言行優先和列優先的問題深入分析

摘要本文主要**的是「行優先」原則和「列優先」原則的問題。

1. 背景

首先了解「行優先」和「列優先」的知識,這兩種方式在數學上的直觀描述如下,給定如下矩陣:

根據行優先的原則,其排序方式為

根據列優先的原則,其排序方式為

2. 計算機領域的應用

行列優先原則在計算機領域的應用主要如下。行優先或者列優先沒有好壞,但其直接涉及到對記憶體中資料的最佳儲存訪問方式。因為在記憶體使用上,程式訪問的記憶體位址之間連續性越好,程式的訪問效率就越高;相應地,程式訪問的記憶體位址之間連續性越差。所以,我們應該盡量在行優先機制的編譯器,比如c/c++,cuda等等上,採用行優先的資料儲存方式;在列優先機制的編譯器,比如fortune, matlab等等上,採用列優先的資料儲存方式。但這種思想滲透到程式設計中之後,**的質量就會提高乙個檔次。

3. 以矩陣計算為例(matlab編譯器下測試)

% data

a = [ 1 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9];

b = [ 1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9];

c = zeros(9,9);

% the method of matrix multiplication in matlab

tic

c = a*b;

toc

% our impletation method of matrix multiplication

tic

for ra = 1:9 % raws of the matrix a

for cb = 1:9 % columns of the matrix b

for len = 1:2

c(ra,cb) = a(ra,len)*b(len,cb)+c(ra,cb);

end

end

end

toc

% optimal method 1

tic

for cb = 1:9www.cppcns.com % columns of the matrix b

for ra = 1:9 % raws of the matrix a

for len = 1:2

c(ra,cb) = a(ra,len)*b(len,cb)+c(ra,cb);

end

end

end

toc

% advanced optimal method 2

a = a'; % you can also directly given a = [ 1 2 3 4 5 6 7 8 9

% 1 2 3 4 5 6 7 8 9zunebyhs];

b = [ 1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9];

tic

for i = 1:9 % columns of the matrix a

for j = 1:9 % columns of the matrix b

for len = 1:2

c(i,j) = a(len,i)*b(len,j)+c(i,j);

end

end

end

toc4. 測試和分析

測試結果如上圖所示,第乙個時間為matlab自帶的乘法運算,第二個為我們原始實現的乘法計算,第三個為迴圈中行列變換(適應列優先編譯器的處理)程式設計客棧。

最重要的是第四個是本人原創的矩陣乘法方法,簡單地說就是將a矩陣轉置,然後設計相應的演算法實現矩陣乘運算。在這個點上,希望在理解原理的基礎上能給讀者一些啟發。在本例中,這樣做效率最高,原因其一是本例中原zunebyhs始資料結構上適合我這樣處理;原因其二是這樣做的目的是使得任何乙個子乘程式設計客棧法的處理上,兩乘數所在的記憶體空間上都是連續,而不僅僅是乙個連續(注意:這是本文的核心,讀者理解透了一定會很有收穫,認真看我給出的程式實現。這是核心,不懂的可以交流思想)!

另外,本文中我給出的這個方法是矩陣乘法裡面最優的方法,至少數學邏輯上是這樣。之所以matlab自帶的乘法計算之所以效能還不錯,是因為matlab自帶的運算都是經過優化的,包括硬體加速,系統加速等自己設計的應用很能呼叫加速方法。

本文標題: c語言行優先和列優先的問題深入分析

本文位址:

C語言 陣列 列優先 實現

c語言陣列結構列優先順序儲存的實現 gcc編譯 從行優先轉換為列優先儲存方式,與行優先相比,不同之處在於改變了陣列維界基址的先後順序,從而改變了映像函式常量基址。1 2 brief c語言 陣列 列優先 實現 3 author wid 4 date 2013 11 025 67 8 9 includ...

矩陣基礎 1 行優先和列優先的問題

原 2016年08月18日 18 37 00 林微 摘要本文主要 的是 行優先 原則和 列優先 原則的問題。1.背景 首先了解 行優先 和 列優先 的知識,這兩種方式在數學上的直觀描述如下,給定如下矩陣 根據行優先的原則,其排序方式為 根據列優先的原則,其排序方式為 2.計算機領域的應用 行列優先原...

C語言優先順序的問題

if riiscon 1 6 0 和 if riiscon 1 6 0 後者使我的程式一直不能執行。乙個c語言優先順序的問題導致我弄了好幾天的程式,以後一定要堅信乙個小小的c語言錯誤都會導致你程式無法執行,一定不要小看這個好像不起眼的錯誤,他們會讓你付出代價的,正想現在我經歷的一樣,乙個 運算子和乙...