Eigen入門之密集矩陣 10 - 矩陣的行優先及列優先存儲

簡介

本篇介紹Eigen中矩陣及二維數組的係數存儲順序–行優先及列優先,已經如何指定優先順序。

行優先(row-majoe)、 列優先(column-majoe)

矩陣的係數條目組成了一個二維的結構,在內存內存儲矩陣時,必須以某種結構來佈局。Eigen內提供了2中佈局方式: 行優先、列優先。

如有矩陣A,如下:
A=[822991443545] A = \begin{bmatrix} 8 & 2 & 2 & 9 \\ 9 & 1 & 4 & 4 \\ 3 & 5 & 4 & 5 \end{bmatrix}

那麼,以行優先存儲時,其係數一行一行地,按照行順序。其係數在內存中的順序如此:
8 2 2 9 9 1 4 4 3 5 4 5

而以列優先的情況下,其係數的順序則如此:
8 9 3 2 1 5 2 4 4 9 4 5

請看一下,並理解下面的示例,其使用PlainObjectBase::data()data()函數,來得到矩陣保存於內存中的數據指針。

Matrix<int, 3, 4, ColMajor> Acolmajor;
Acolmajor << 8, 2, 2, 9,
             9, 1, 4, 4,
             3, 5, 4, 5;

cout << "The matrix A:" << endl;
cout << Acolmajor << endl << endl; 

cout << "In memory (column-major):" << endl;
for (int i = 0; i < Acolmajor.size(); i++)
  cout << *(Acolmajor.data() + i) << "  ";

cout << endl << endl;

Matrix<int, 3, 4, RowMajor> Arowmajor = Acolmajor;
cout << "In memory (row-major):" << endl;

for (int i = 0; i < Arowmajor.size(); i++)
  cout << *(Arowmajor.data() + i) << "  ";
cout << endl;

執行的結果:

The matrix A:
8 2 2 9
9 1 4 4
3 5 4 5

In memory (column-major):
8  9  3  2  1  5  2  4  4  9  4  5  

In memory (row-major):
8  2  2  9  9  1  4  4  3  5 

Eigen中的存儲方式

一個矩陣或一個二維數組可以通過指定的模板參數選項來設置矩陣和數組的存儲模式/方式。就如矩陣類的說明所說,矩陣類模板有6個模板參數,其中三個是強制性的(標量,RowsAtCompileTime和ColsAtCompileTime),另外三是可選的(Options選項,MaxRowsAtCompileTime和MaxColsAtCompileTime)。如果選項參數設置爲RowMajor,那麼矩陣或數組存儲採樣行優先順序;如果設置爲ColMajor,然後存儲在列爲主的順序。

這種機制就用於爲程序指定的矩陣的存儲順序。如果沒有指定存儲順序,那麼就默認存儲條目採樣列優先column-major。Eigen內定義的簡化的typedef (Matrix3f ArrayXXd,等等)也是如此。
  
一個使用某種存儲順序的矩陣/數組可以使用賦值表達式,賦值給使用其他存儲順序矩陣/數組,如上面的示例的程序,在 Arowmajor初始化時,使用Acolmajor爲其賦值。Eigen將自動重新排序所有的係數。更普遍的是,行和列爲主的矩陣可以混合使用在一個表達式內。

選擇哪種存儲模式?

在程序中,選擇哪種存儲模式,這依賴於我們自己的程序。

  • 如果你的程序還使用了其他的開發庫,而不是隻有Eigen。我們需要考慮相互之間的匹配的問題。這時,我們在程序中使用統一的存儲順序,程序會更容易、更快地開發。
  • 如果算法要以行的方式操作,則程序採樣行優先模式,會帶來更好地性能。同樣,採樣列優先的模式,在需要訪問列的時候更適合。
  • Eigen缺省地採樣列優先模式。自然地,大多數的開發和測試使用了列爲主的矩陣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章