2016-03-05 113 views
3

我想弄清楚在C++中创建矩阵的最佳方法。到目前为止,我有两个选项:在C++中实现大输入矩阵的最有效方法?

1)一个存储所有数据在一个“行”中,但使用模数和算术的向量可以像二维表一样访问。

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}; 

当每个斑点将包含一个指向矢量

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

在基质上的一些要求(在本实施例3的“子”的载体。):

  • 它需要这就是为什么我在我的例子中选择使用矢量的原因。

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

  • 它必须能够支持行插入(在结束时),行的删除(从中间),附加一个矩阵到另一个(通过将其列到原始矩阵的左端,如果我们想象它像一个表)

有谁知道,如果这些选项之一是显著比其他更有效的大投入?或者,有没有人有更好的建议来实现这个矩阵?

+0

您可以检查Boost.uBLAS。 http://www.boost.org/doc/libs/1_60_0/libs/numeric/ublas/doc/index.html – mustafagonul

+0

您是否希望主要针对速度或内存进行优化? – wally

+0

我通常使用一个直矢量,并做我自己的下标计算。对于异构数据,我可能会使用指针向量。如果您有很多空单元(稀疏矩阵)并需要优化内存,其他选项可能更合适。 – Logicrat

回答

2

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

尽管如何布置数据的细节将取决于您的特定使用模式。在绩效方面,你总是需要衡量。

+0

当涉及删除过程时,“one vector”方法是否会优于其他列由于更好的缓存效率,矩阵中间的一行? – user5482356

+0

@ user5482356:现代CPU非常擅长移动连续内存的大块,所以它可能不如您想象的那么糟糕。但是,如果行删除非常普遍,那么最好不要移动元素来操纵行指针。 –

+0

@VaughnCato,你是什么意思的CPU擅长移动内存? cpu究竟能在这里做什么? – SergeyA

相关问题