我正在对日志域中的浮点稀疏矩阵进行一些计算,因此"空"条目实际上是-Inf(使用-FLT_MAX).我现在正在使用自定义稀疏矩阵类,但我渴望交换一个现成的替代品.
这是用C++编写的.我倾向于查看Eigen和Boost uBlas中的压缩列矩阵.但是,不清楚是否支持"零"的自定义值(可能由模板参数提供).有没有人有建议?
澄清:
我想要的是:对于之前没有"设置"的任何单元格(i,j),我想mat [i,j]返回-Inf ...所以这可能更好地描述为"默认"稀疏矩阵的"空"条目的值.
我正在使用它来执行HMM递归(Viterbi,sum-product),并保留在日志域中以避免下溢.
我没有做任何矩阵操作......我只是填写一个动态编程画面.我想使用稀疏矩阵类,因为我只填充矩阵的一个带,我希望有效的内存使用.压缩的带状矩阵将提供良好的性能,因为我按顺序填充矩阵.
我正在尝试编写一个小的Python 2.x API来支持获取一个
jobby jobNumber,其中jobNumber提供了一个整数.有时用户提供一个jobNumber以0开头的整数文字,例如037537.(这是因为它们已被R语言所淹没,这是一种明智地考虑的语言037537==37537.)然而,Python认为以"0"开头的整数文字是OCTAL 037537!=37537,而是037537==16223.这让我觉得这是对最小惊喜原则的公然侮辱,幸好看起来这在Python 3中得到了修复---参见PEP 3127.
但我现在仍然坚持使用Python 2.7.所以我的用户这样做:
>>> fetchJob(037537)
Run Code Online (Sandbox Code Playgroud)
并默默地得到错误的工作(16223),或者:
>>> fetchJob(038537)
File "<stdin>", line 1
fetchJob(038537)
^
SyntaxError: invalid token
Run Code Online (Sandbox Code Playgroud)
Python拒绝八进制不兼容的数字.
似乎没有提供任何东西__future__以允许我获得Py3K行为---它必须以某种方式内置到Python,因为它至少需要更改词法分析器.
是否有人知道如何保护我的用户在这种情况下做错工作?目前,我能想到的最好的方法是更改该API,以便它采用字符串而不是int.
TL; DR:我非常希望in_edges
图上的迭代顺序(adjacency_list带有 edge_list of setS)是确定性的,但据我所知,迭代顺序是由一个比较运算符决定的,它只是指针比较---因此迭代顺序由 的变幻莫测决定
malloc。帮助!
为了具体起见,我的图表和相关类型是:
struct VertexCargo { int Id; ... };
typedef adjacency_list<setS, vecS, bidirectionalS, property<vertex_info_t, VertexCargo> > Graph;
typedef graph_traits<Graph>::edge_descriptor ED;
typedef graph_traits<Graph>::vertex_descriptor VD;
Run Code Online (Sandbox Code Playgroud)
我的逻辑,以防有人在任何地方发现谬误:
in_edges 迭代直接由边列表容器的迭代决定
setS隐含底层容器的边缘列表std::set<edge_desc_impl>
注意:这个假设是不正确的;它实际上是一个std::set<StoredEdge,它提供了一个比较边缘目标的比较器。
std::set<edge_desc_impl> 迭代顺序由
operator<(edge_desc_impl, edge_desc_impl)
operator<(edge_desc_impl, edge_desc_impl)最终只是一个指针比较;
operator< 在boost/graph/detail/edge.hpp(boost 1.58) 中定义:
30 template <typename Directed, typename Vertex>
31 class edge_desc_impl : public edge_base<Directed,Vertex> {
...
35 typedef void property_type;
36
37 …Run Code Online (Sandbox Code Playgroud)