为什么 Eigen 默认使用 Column-Major 而不是 Row-Major?

问题描述 投票:0回答:3

虽然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 库是否存在任何性能(缓存局部性、加载/存储速度等)原因?

c++ eigen eigen3
3个回答
2
投票

其实你是对的,本来对于row-major存储数据来说,row-major遍历有更好的缓存局部性,从而有更高的缓存命中率。

默认情况下,

Eigen 主要顺序存储数据。这似乎有点违反直觉,但是,Eigen 默认情况下也以 col-major order 遍历数据。

另外,你可以在这里找到官方文档Eigen存储顺序: 当矩阵以行优先顺序存储时,由于数据局部性更好,逐行遍历矩阵的算法会更快。同样,对于列主矩阵,逐列遍历速度更快。


2
投票

在许多领域,包括信号处理,向量被认为是列向量

因此,大多数信号处理算法都在矩阵的列上运行。当有人在 C++ 中实现此类算法(行优先)时,由于严重的缓存未命中,计算性能会受到严重损害。

Eigen 的默认列主顺序在这种情况下非常方便。这也是 Matlab 选择列专业的原因。


0
投票

Eigen 作为一个线性代数库,遵循一些数学约定。矩阵和向量的出现源于求解线性方程组的需要。从这个非常原始的问题开始,从数学上讲,所有向量都应该是列向量,因此将矩阵定义为列矩阵也符合直觉。在 Eigen 的应用程序中,即线性代数计算,使用列向量使用户更方便。

© www.soinside.com 2019 - 2024. All rights reserved.