虽然Eigen是C++库并且C/C++使用行优先存储结构,但为什么Eigen更喜欢使用列优先存储顺序?从 Why does MATLAB use column-major order? 帖子中,我了解到 MATLAB 使用它是因为历史(由于 FORTRAN)原因。但据我所知,Eigen 一开始是基于 C++ 构建的。
在 Eigen 图书馆网站上写着:
Eigen 中的默认值是列优先。当然,Eigen 库的大部分开发和测试都是通过列主矩阵完成的。这意味着,即使我们的目标是透明地支持列主和行主存储顺序,Eigen 库也可能最适合列主矩阵。 (取自https://eigen.tuxfamily.org/dox/group__TopicStorageOrders.html)
也许是因为经常使用C++和OpenCV,我的大脑倾向于以行优先的形式思考。使用列主矩阵开发和测试 Eigen 库是否存在任何性能(缓存局部性、加载/存储速度等)原因?
其实你是对的,本来对于row-major存储数据来说,row-major遍历有更好的缓存局部性,从而有更高的缓存命中率。
默认情况下,Eigen 以主要顺序存储数据。这似乎有点违反直觉,但是,Eigen 默认情况下也以 col-major order 遍历数据。
另外,你可以在这里找到官方文档Eigen存储顺序: 当矩阵以行优先顺序存储时,由于数据局部性更好,逐行遍历矩阵的算法会更快。同样,对于列主矩阵,逐列遍历速度更快。
在许多领域,包括信号处理,向量被认为是列向量。
因此,大多数信号处理算法都在矩阵的列上运行。当有人在 C++ 中实现此类算法(行优先)时,由于严重的缓存未命中,计算性能会受到严重损害。
Eigen 的默认列主顺序在这种情况下非常方便。这也是 Matlab 选择列专业的原因。
Eigen 作为一个线性代数库,遵循一些数学约定。矩阵和向量的出现源于求解线性方程组的需要。从这个非常原始的问题开始,从数学上讲,所有向量都应该是列向量,因此将矩阵定义为列矩阵也符合直觉。在 Eigen 的应用程序中,即线性代数计算,使用列向量使用户更方便。