一直搞不懂什么是矩阵的行优先和列优先存储,现在在看Eigen的tutorial,里面详细的解释了什么是行优先和列优先,在这里做下笔记。
行优先和列优先存储
我们随便找一个矩阵来说明吧,比如说如下的矩阵a:
1, 3, 5
4, 2, 6,
7, 8, 9
我们都知道,这是一个3行3列的矩阵,但是在计算机内存里存储的时候,是线性的存储,也就是说所有矩阵的元素都被存储到了一行。
如果是行优先存储,那么矩阵a在内存里是这么存储的1,3,5,4,2,6,7,8,9。如果使用的是列优先存储,那么矩阵a在内存里是这么存储的1,4,7,3,2,8,5,6,9。
Eigen代码
我们可以用Eigen代码来解释上面的例子。data()函数返回矩阵第一个元素的地址。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
Matrix<int, 2, 3, ColMajor> Acolmajor;
// Acolmajor << 8, 2, 2, 9,
// 9, 1, 4, 4,
// 3, 5, 4, 5;
Acolmajor << 1, 2, 3,
4, 5, 6;
cout << Acolmajor << endl;
cout << "In memory" << endl;
for (int i = 0; i < 6; i++) cout << *(Acolmajor.data() + i) << endl;
Matrix<int, 2, 3, RowMajor> Arowmajor;
Arowmajor << 1, 2, 3,
4, 5, 6;
cout << Arowmajor << endl;
cout << "In memory" << endl;
for (int i = 0; i < 6; i++) cout << *(Arowmajor.data() + i) << endl;
}
结果为:
1 2 3
4 5 6
In memory
1
4
2
5
3
6
1 2 3
4 5 6
In memory
1
2
3
4
5
6
可以看出,相同的矩阵在内存里被不同的存储方式存放了。
如何选择使用哪种存储方式?
对于行优先遍历的,使用行优先存储,对于列优先遍历的,使用列优先存储。Eigen默认使用列优先存储。