行优先存储和列优先存储

来源:互联网 发布:贵州浪人网络投诉 编辑:程序博客网 时间:2024/05/22 00:43

一直搞不懂什么是矩阵的行优先和列优先存储,现在在看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 34 5 6In memory1425361 2 34 5 6In memory123456

可以看出,相同的矩阵在内存里被不同的存储方式存放了。

如何选择使用哪种存储方式?

对于行优先遍历的,使用行优先存储,对于列优先遍历的,使用列优先存储。Eigen默认使用列优先存储。

原创粉丝点击