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} A=???893?215?244?945????
那么,以行優先存儲時,其系數一行一行地,按照行順序。其系數在內存中的順序如此:
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 5In 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 5Eigen中的存儲方式
一個矩陣或一個二維數組可以通過指定的模板參數選項來設置矩陣和數組的存儲模式/方式。就如矩陣類的說明所說,矩陣類模板有6個模板參數,其中三個是強制性的(標量,RowsAtCompileTime和ColsAtCompileTime),另外三是可選的(Options選項,MaxRowsAtCompileTime和MaxColsAtCompileTime)。如果選項參數設置為RowMajor,那么矩陣或數組存儲采樣行優先順序;如果設置為ColMajor,然后存儲在列為主的順序。
這種機制就用于為程序指定的矩陣的存儲順序。如果沒有指定存儲順序,那么就默認存儲條目采樣列優先column-major。Eigen內定義的簡化的typedef (Matrix3f ArrayXXd,等等)也是如此。
一個使用某種存儲順序的矩陣/數組可以使用賦值表達式,賦值給使用其他存儲順序矩陣/數組,如上面的示例的程序,在 Arowmajor初始化時,使用Acolmajor為其賦值。Eigen將自動重新排序所有的系數。更普遍的是,行和列為主的矩陣可以混合使用在一個表達式內。
選擇哪種存儲模式?
在程序中,選擇哪種存儲模式,這依賴于我們自己的程序。
- 如果你的程序還使用了其他的開發庫,而不是只有Eigen。我們需要考慮相互之間的匹配的問題。這時,我們在程序中使用統一的存儲順序,程序會更容易、更快地開發。
- 如果算法要以行的方式操作,則程序采樣行優先模式,會帶來更好地性能。同樣,采樣列優先的模式,在需要訪問列的時候更適合。
- Eigen缺省地采樣列優先模式。自然地,大多數的開發和測試使用了列為主的矩陣。
總結
以上是生活随笔為你收集整理的Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 Xbox 360 线上商店将下架
- 下一篇: Eigen密集矩阵求解 1 - 线性代数