在c ++中实现大输入矩阵的最有效方法?

时间:2016-03-05 15:17:16

标签: c++ performance matrix vector

我试图找出在C ++中创建矩阵的最佳方法。到目前为止,我有两个选择:

1)一个向量,将所有数据存储在一行"行中,"但是使用模数和算术,可以像2D表一样访问。

OR

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" sub"此例中的矢量)

Name -> name_vec = {Allen, Rick, Mary}
Course -> course_vec = {Chemistry, English, Physics}
Grade -> grade_vec = {76, 84, 93}

对矩阵的一些要求:

  • 它需要可以成长,这就是我选择在我的例子中使用向量的原因。

  • 它需要能够有效处理大量数据

  • 它必须能够支持行插入(在末尾),行删除(从中间),将一个矩阵附加到另一个矩阵(通过将其列添加到原始矩阵的左端,如果我们可视化它就像一张桌子)

有人知道这些选项中的一个在大型输入上是否会比另一个更有效?或者,是否有人有更好的建议来实现这个矩阵?

1 个答案:

答案 0 :(得分:2)

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

有关如何布置数据的详细信息将取决于您的特定使用模式。在表现方面,你总是需要衡量。