带有字符串键的矩阵是不是有 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 来解决您的问题。模板以上是关于带有字符串键的矩阵是不是有 Boost(或其他常见库)类型?的主要内容,如果未能解决你的问题,请参考以下文章
Boost(或其他库)是不是提供了一种将“无构造函数”类的名称提升为使用聚合初始化的函数对象的方法?