2016-03-05 116 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

相關問題