在 C++ 中对大输入实现矩阵的最有效方法?
Posted
技术标签:
【中文标题】在 C++ 中对大输入实现矩阵的最有效方法?【英文标题】:Most efficient way to implement matrix on large inputs in c++? 【发布时间】:2016-03-05 15:17:15 【问题描述】:我正在尝试找出在 C++ 中创建矩阵的最佳方法。到目前为止,我有两个选择:
1) 一个向量将所有数据存储在一个“行”中,但使用模和算术,可以像二维表一样访问。
或
2) 包含指向其他向量的指针的向量,使得原始向量表示集合列,并且它指向的向量包含沿每列行向下的值。
例如,如果我们有一个这样的表:
Name | Course | Grade
Allen | Chemistry | 76
Rick | English | 84
Mary | Physics | 93
我的第一个示例将所有数据存储在一个向量中,如下所示:
my_vec = Name, Course, Grade,
Allen, Chemistry, 76,
Rick, English, 84,
Mary, Physics, 93
(假设存储在同一个向量中的值的异构性质现在不是问题)
我的第二个示例将像这样存储数据:
vec1 = Name, Course, Grade;
每个点都包含一个指向向量的指针(本例中为 3 个“子”向量)
Name -> name_vec = Allen, Rick, Mary
Course -> course_vec = Chemistry, English, Physics
Grade -> grade_vec = 76, 84, 93
对矩阵的一些要求:
它需要是可增长的,这就是我选择在示例中使用向量的原因。
需要能够高效处理大量数据
它必须能够支持行插入(在末尾),行删除(从中间),将一个矩阵附加到另一个矩阵(通过将其列添加到原始矩阵的左端,如果我们可视化它就像一张桌子)
有谁知道这些选项中的一个在大输入时是否会比另一个更有效?或者,是否有人对实现这个矩阵有更好的建议?
【问题讨论】:
您可以查看 Boost.uBLAS。 boost.org/doc/libs/1_60_0/libs/numeric/ublas/doc/index.html 您是否希望主要针对速度或内存进行优化? 我通常使用直向量,并自己进行下标计算。对于异构数据,我可能会使用指针向量。如果您有很多空单元(稀疏矩阵)并且需要优化内存,其他选项可能更合适。 @flatmouse 我希望在速度和内存之间找到一个好的媒介,虽然我认为速度更重要 如果你假设异构数据,为什么不考虑vector
的struct
s?
【参考方案1】:
根据我的经验,主要问题是良好的缓存使用率。使用模算术与指针来访问行并没有很大的优势,但是将数据保存在连续的内存中对于高效访问非常重要。向量的向量可能不会是最有效的,因为单个向量可能分散在整个内存中,除非您使用自定义分配器。指向一个连续元素块的部分的指针向量可能更好。
不过,有关如何布置数据的详细信息将取决于您的特定使用模式。就性能而言,您始终需要衡量。
【讨论】:
在删除矩阵中间的一行的过程中,“一个向量”方法是否比另一种更好,因为缓存效率更高? @user5482356:现代 CPU 非常擅长移动大块连续内存,因此它可能没有您想象的那么糟糕。但是,如果行删除很常见,那么操作行指针而不是移动元素可能会更好。 @VaughnCato,你说的cpu擅长移动内存是什么意思? cpu 究竟能在这里做什么? @SergeyA:CPU可以检测到你正在顺序访问内存并预取:futurechips.org/chip-design-for-all/prefetching.html @VaughnCato,考虑到内存移动通常是通过特定的 CPU 设备和rep; movsb
不需要 modern cpu?以上是关于在 C++ 中对大输入实现矩阵的最有效方法?的主要内容,如果未能解决你的问题,请参考以下文章