带有字符串键的矩阵是不是有 Boost(或其他常见库)类型?

Posted

技术标签:

【中文标题】带有字符串键的矩阵是不是有 Boost(或其他常见库)类型?【英文标题】:Is there a Boost (or other common lib) type for matrices with string keys?带有字符串键的矩阵是否有 Boost(或其他常见库)类型? 【发布时间】:2010-05-21 21:58:10 【问题描述】:

我有一个密集矩阵,其中索引对应于基因。虽然基因标识符通常是整数,但它们不是连续的整数。它们也可以是字符串。

我想我可以使用某种带有整数键的 boost 稀疏矩阵,它们是否连续都没关系。或者这仍然会占据很大的空间,特别是如果某些基因有九位数的标识符?

此外,我担心稀疏存储是不合适的,因为这是一个全部矩阵(如果基因存在,每个细胞中都会有一段距离)。

我不太可能需要执行任何矩阵运算(例如矩阵乘法)。我需要从矩阵(切片)中提取向量。

似乎最好的矩阵类型将由 Boost unordered_map(哈希映射)或什至只是一个 STL 映射作为键控。

我看错了吗?我真的需要自己动手吗?我以为我以前在某个地方看到过这样的课程。

谢谢!

【问题讨论】:

为什么没有解释就投反对票? 【参考方案1】:

您可以使用std::map 将基因标识符映射到唯一的、连续分配的整数(每次向图谱添加新的基因标识符时,您可以将图谱的大小作为其标识符,假设您从不删除基因从地图上)。

如果您希望能够根据其唯一整数来搜索基因的标识符,您可以使用第二张图,也可以使用boost::bimap,它提供了元素的双向映射。

至于使用哪个矩阵容器,可以考虑boost::ublas::matrix;它提供了对矩阵行和列的类向量访问。

【讨论】:

给它地图的大小作为它的标识符?你能澄清一下吗? bimap 看起来很有趣。我以前从未见过。我希望 boost 对其类型有更清晰的摘要。 @mohawkjohn:如果您想在将基因添加到地图时为基因分配唯一的、递增的 id(例如,std::map<std::string, unsigned>,其中字符串是基因的名称和 int是你分配给它的id),你可以做m.insert(std::make_pair(str, m.size()))。当您将每个元素插入地图时,它的大小会增加一,因此生成的 id 将是唯一的。【参考方案2】:

如果你不需要矩阵运算,你就不需要矩阵。可以使用纯 C++ 中的map<map<string> > 或使用 Boost 中相应的哈希映射来完成带有字符串键的 2D 映射。

【讨论】:

【参考方案3】:

Boost.MultiArray 允许您使用非连续索引进行管理。

如果您想要使用具有静态大小的矩阵进行高效实现,还有Boost.LA,现在正在审核计划中。

还有 NT2 应该很快提交给 Boost。

【讨论】:

我不知道有一个 Boost MultiArray。不确定它是否对此有用,但感谢您指出。这在某些时候肯定对我有用。 希望这会有所帮助。只是一个问题:索引字符串在编译时是否知道?如果是这种情况,您可以在编译时关联一个唯一且连续的整数,并使用 MultiArray 来解决您的问题。模板 struct string_to_index;模板 struct string_to_index const int value = 1; ;模板 struct string_to_index const int value = 2; ; ...

以上是关于带有字符串键的矩阵是不是有 Boost(或其他常见库)类型?的主要内容,如果未能解决你的问题,请参考以下文章

Boost(或其他库)是不是提供了一种将“无构造函数”类的名称提升为使用聚合初始化的函数对象的方法?

如何实现具有两个或更多键的哈希函数?

boost::unordered_map 中以结构为键的 boost 变体

带有没有外键的数据库的 Spring JPA

填充提升向量或矩阵

C++ boost解析动态生成的json字符串(不是文件)