我正在用 C++ 编写程序,需要生成图形并计算一些度量。我正在使用 Visual Studio 2013 和 Igraph C 库。此时我可以根据自定义信息创建图表并计算一些指标,例如中间值和接近中心性,但是当我尝试计算特征向量中心性时,程序崩溃并显示此消息:
"Run-Time Check Failure #3 - The variable 'tgetv0' is being used without being initialized."
tgetv0 变量用于 Igraph 源的 dgetv.c 内部。 这是我的代码:
void GraphObject::calcEigen()
{
igraph_arpack_options_t options;
igraph_real_t value;
igraph_vector_t weights;
igraph_vector_init(&weights, igraph_ecount(&cGraph)); //cGraph is already created.
igraph_vector_init(&eigenRes, igraph_vcount(&cGraph)); //All ..Res igraph_vector_t are declarated in header
igraph_vector_init(&betweennesRes, 0);
igraph_vector_init(&closenessRes, 0);
igraph_arpack_options_init(&options);
igraph_betweenness(&cGraph, &betweennesRes, igraph_vss_all(), 0, 0, 1);
igraph_closeness(&cGraph, &closenessRes, igraph_vss_all(), IGRAPH_ALL, 0, 1);
igraph_eigenvector_centrality(&cGraph, &eigenRes, &value, 0, 1, &weights, &options);
}
正确计算了接近度和间隔度,但在特征向量函数上崩溃了。
在对文档、互联网和调试器进行大量研究后,我无法确定问题出在哪里,尤其是当我尝试文档中的示例代码时 http://igraph.org/c/doc/igraph-Structural.html#igraph_eigenvector_centrality (复制/粘贴)并制作相同的。这是库问题还是示例问题,我遗漏了什么?
当我初始化权重 vector 然后调用 igraph_null(&weights) 时,它起作用了,但所有特征值的结果都是 1,这是不正确的结果。我做错了什么?
最佳答案
让我们假设 Visual Studio 是正确的,我们确实有一个名为 tgetv0
的变量未初始化使用。我扫描了 igraph 的源代码,看起来确实有两个地方可能是这种情况。其中一个在 src/lapack/dnaupd.c
中,另一个在 src/lapack/dsaupd.c
中。这两个文件都是使用 f2c
从 Fortran 转换而来的,因此很难判断问题是出现在原始 Fortran 代码中还是在转换过程中引入。无论哪种方式,您都可以通过查找在 src/lapack/dnaupd.c
和 src/lapack/dsaupd 中声明
并将其初始化为值 0。在我的版本中,要更改的行是 tgetv0
的行轻松解决此问题。 csrc/lapack/dnaupd.c
中的第 486 行和 src/lapack 中的第 482 行/dsaupd.c
.
请添加评论以确认该解决方案是否适合您 - 如果有效,我将提交一个补丁到 igraph 源代码树。
关于c++ - Igraph 特征向量中心性运行时错误 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096715/