2010-05-21 22 views
-1

我有一個密度矩陣,其中的索引對應於基因。雖然基因標識符通常是整數,但它們不是連續的整數。它們也可以是字符串。是否有帶字符串鍵的矩陣的Boost(或其他常見的lib)類型?

我想我可以使用某種整數鍵的boost稀疏矩陣,並且它們是否連續是沒關係的。或者這仍然會佔據很大的空間,特別是如果某些基因的標識符是九位數?

此外,我擔心稀疏存儲是不合適的,因爲這是一個全逐所有矩陣(會有在每一個小區中的距離,所提供的基因存在)。

我不太可能需要執行任何矩陣操作(例如,矩陣乘法)。我需要將矢量從矩陣(片)中拉出。

好像矩陣的最佳類型將由升壓unordered_map(哈希映射)被鍵入,或者甚至只是一個STL地圖。

我看着這個錯誤的方式嗎?我真的需要推出自己的?我以爲我以前在某個地方看過這樣的課。

謝謝!

+0

爲什麼downvotes沒有解釋? – 2016-01-21 14:37:14

回答

2

您可以使用std::map將基因標識符映射到唯一的,連續分配的整數(每當您向地圖添加新的基因標識符時,您都可以將地圖的大小作爲其標識符,假設您從未從基因標識中移除基因地圖)。

如果您希望能夠根據其唯一整數搜索基因的標識符,則可以使用第二個映射,或者可以使用boost::bimap,它提供元素的雙向映射。

至於要使用哪個矩陣容器,可以考慮boost::ublas::matrix;它提供了對矩陣的行和列的向量式訪問。

+0

給它的地圖的尺寸​​作爲它的標識符?你能澄清一下嗎? bimap看起來很有趣。我以前從未見過。我希望提升有更清晰的類型摘要。 – 2010-05-23 20:29:11

+0

@mohawkjohn:如果您想在將基因添加到映射時指定唯一的遞增id(例如,一個'std :: map ',其中的字符串是基因和int是你分配給它的id),你可以做'm.insert(std :: make_pair(str,m.size()))'。將每個元素插入地圖時,它的大小將增加1,因此生成的ID將是唯一的。 – 2010-05-23 20:35:20

2

如果您不需要矩陣操作,則不需要矩陣。帶有字符串鍵的2D地圖可以通過簡單C++中的map<map<string> >或使用Boost相應的哈希映射來完成。

0

有Boost.MultiArray這將允許您管理與非連續索引。

如果你想要一個高效的實現與靜態大小矩陣的工作,也有Boost.LA,這在目前的審查進度。

而拉斯也有NT2這應該很快提交給Boost。

+0

我不知道有一個Boost MultiArray。不知道它是否會對此有用,但謝謝指出。這在某種程度上肯定對我有用。 – 2010-05-23 20:30:45

+0

希望這有助於。只是一個問題:索引字符串在編譯時是否知道?如果是這種情況,您可以在編譯時將唯一的連續整數關聯起來,並使用MultiArray解決您的問題。 template struct string_to_index; template <> struct string_to_index <"AAAA"> { const int value = 1; }; template <> struct string_to_index <"BBB"> { const int value = 2; }; ... – 2010-05-23 23:15:38

相關問題