2

我正在使用 SimpleHypergraphs.jl 库并尝试从文本文件(如 csv)构建超图。

例如,我想从 csv 文件中加载一个超图,如下所示:

0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0
using SimpleHypergraphs
using CSV

df = CSV.read("edge_weights.csv", DataFrame)
m = Matrix{Float64}(df)
h = Hypergraph(m)

我收到以下错误:“错误:MethodError:没有方法匹配 Hypergraph(::Matrix{Float64})”

我是 Julia 的新手,我非常感谢我如何实现这一点的一个例子。谢谢!

4

1 回答 1

2

作为Hypergraph构造函数传递的矩阵应该具有类型为某种数字类型的元素(例如Union{Nothing, T}, 而不仅仅是一个.TMatrix{Union{Float64,Nothing}}Matrix{Float64}

在 SimpleHypegraphs.jl 中,我们使用nothing(而不是0)来表示顶点不属于超边,因为在许多超图算法/应用程序中,顶点可能属于权重为零的超边。

因此,您可以使用以下代码读取文件(为了重现性,我将文件内容放入文本变量中):

using DataFrames, CSV, SimpleHypergraphs

txt = """0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0"""

df = CSV.read(IOBuffer(txt), DataFrame;header=0)

mat = Matrix{Union{Float64,Nothing}}(df)

这个矩阵现在可以很容易地用作Hypergraph构造函数。

julia> h1 = Hypergraph(mat)
4×4 Hypergraph{Float64, Nothing, Nothing, Dict{Int64, Float64}}:
 0.0  7.0  0.0  0.0
 1.3  2.8  4.5  0.0
 0.0  1.3  3.1  4.2
 1.2  0.0  5.6  5.0

但是,这可能不是您所需要的,因为零 ( 0.0) 表示顶点属于权重为零的超边的情况:

draw(h1, HyperNetX)

在此处输入图像描述

因此,您实际上可能希望将零转换为nothings 以表示顶点不属于超边的情况:

h2 = Hypergraph(replace(mat, 0 => nothing))

现在你得到了你想要的:

draw(h2, HyperNetX)

在此处输入图像描述

于 2021-05-03T21:56:48.913 回答