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

2021-09-23 20:37:41 字數 2454 閱讀 1768

2023年08月18日 18:37:00

林微

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

1. 背景

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

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

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

2. 計算機領域的應用

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

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

% data

a = [ 1 1

2 23 3

4 45 5

6 67 7

8 89 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

ticfor 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);

endend

endtoc

% optimal method 1

ticfor cb = 1:9 % 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);

endend

endtoc

% 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 9];

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

1 2 3 4 5 6 7 8 9];

ticfor 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);

endend

end

toc

4. 測試和分析

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

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

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

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

c語言行優先和列優先的問題深入分析 摘要本文主要 的是 行優先 原則和 列優先 原則的問題。1.背景 首先了解 行優先 和 列優先 的知識,這兩種方式在數學上的直觀描述如下,給定如下矩陣 根據行優先的原則,其排序方式為 根據列優先的原則,其排序方式為 2.計算機領域的應用 行列優先原則在計算機領域的...

tf 矩陣行和列交換 tf矩陣基礎

一 placeholder tensorflow的設計理念稱之為計算流圖,在編寫程式時,首先構築整個系統的graph,並不會直接生效,這一點和python的其他數值計算庫 如numpy等 不同,graph為靜態的,類似於docker中的映象。然後,在實際的執行時,啟動乙個session,程式才會真正...

關於深度優先和廣度優先的問題

depth first search和breadth first search,即深度優先和廣度優先是圖的兩種搜尋的方法。其實與其說是方法,不如說是兩種思想。下面我們就來介紹這兩種思想。1 depth first search 深度優先是指在圖的查詢中,對每乙個分支深入到不能再深入為止,如果到達了終...