在 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 我希望在速度和内存之间找到一个好的媒介,虽然我认为速度更重要 如果你假设异构数据,为什么不考虑vectorstructs? 【参考方案1】:

根据我的经验,主要问题是良好的缓存使用率。使用模算术与指针来访问行并没有很大的优势,但是将数据保存在连续的内存中对于高效访问非常重要。向量的向量可能不会是最有效的,因为单个向量可能分散在整个内存中,除非您使用自定义分配器。指向一个连续元素块的部分的指针向量可能更好。

不过,有关如何布置数据的详细信息将取决于您的特定使用模式。就性能而言,您始终需要衡量。

【讨论】:

在删除矩阵中间的一行的过程中,“一个向量”方法是否比另一种更好,因为缓存效率更高? @user5482356:现代 CPU 非常擅长移动大块连续内存,因此它可能没有您想象的那么糟糕。但是,如果行删除很常见,那么操作行指针而不是移动元素可能会更好。 @VaughnCato,你说的cpu擅长移动内存是什么意思? cpu 究竟能在这里做什么? @SergeyA:CPU可以检测到你正在顺序访问内存并预取:futurechips.org/chip-design-for-all/prefetching.html @VaughnCato,考虑到内存移动通常是通过特定的 CPU 设备和rep; movsb 不需要 modern cpu?

以上是关于在 C++ 中对大输入实现矩阵的最有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中读取格式化输入的最简单方法是啥?

实现语音搜索的最有效方法

在 MySQL 中存储和访问庞大数据矩阵的最有效方法

从外部附件输入流中读取并推送到 s3 的最有效方法?

在R中对大矩阵进行排序

在 Julia 中定义一个非常稀疏的网络矩阵的最有效方法是啥?